參考:https://www.cnblogs.com/gaobw/p/5872319.html 轉載,別人的排版比我好,看鏈接裏也可以。
File 操作文件,靜態類,對文件整體操作。拷貝,刪除,剪切等
FileInfo 文件類,用來描述一個文件對象
Directory 操作文件夾,靜態類
DirectoryInfo 文件夾中的一個“類”,用來描述一個文件夾對象
Path 文件和文件夾的路徑操作都在Path類中
Environment 裏面包含環境和程序的信息。
Stream 文件流 抽象類
FileStream 文件流
MemoryStream 內存流
NetworkStream 網絡流
StreamReader 快速讀取文本文件
StreamWriter 快速寫入文本文件
【整理】C#文件操作大全
文件與文件夾操作主要用到以下幾個類:
1.File類:
提供用於創建、複製、刪除、移動和打開文件的靜態方法,並協助創建 FileStream 對象。
msdn:http://msdn.microsoft.com/zh-cn/library/system.io.file(v=VS.80).aspx
2.FileInfo類:
提供創建、複製、刪除、移動和打開文件的實例方法,並且幫助創建 FileStream 對象
msdn:http://msdn.microsoft.com/zh-cn/library/system.io.fileinfo(v=VS.80).aspx
3.Directory類:
公開用於創建、移動和枚舉通過目錄和子目錄的靜態方法。
msdn:http://msdn.microsoft.com/zh-cn/library/system.io.directory.aspx
4.DirectoryInfo類:
公開用於創建、移動和枚舉目錄和子目錄的實例方法。
msdn:http://msdn.microsoft.com/zh-cn/library/system.io.directoryinfo.aspx
(注:以下出現的dirPath表示文件夾路徑,filePath表示文件路徑)
1.創建文件夾
Directory.CreateDirectory(@"D:\TestDir");
2.創建文件
創建文件會出現文件被訪問,以至於無法刪除以及編輯。建議用上using。
using (File.Create(@"D:\TestDir\TestFile.txt"));
3.刪除文件
刪除文件時,最好先判斷該文件是否存在!
if (File.Exists(filePath))
{
File.Delete(filePath);
}
4.刪除文件夾
刪除文件夾需要對異常進行處理。可捕獲指定的異常。msdn:http://msdn.microsoft.com/zh-cn/library/62t64db3(v=VS.80).aspx
Directory.Delete(dirPath); //刪除空目錄,否則需捕獲指定異常處理
Directory.Delete(dirPath, true);//刪除該目錄以及其所有內容
5.刪除指定目錄下所有的文件和文件夾
一般有兩種方法:1.刪除目錄後,創建空目錄 2.找出下層文件和文件夾路徑迭代刪除
複製代碼
/// <summary>
/// 刪除指定目錄下所有內容:方法一--刪除目錄,再創建空目錄
/// </summary>
/// <param name="dirPath"></param>
public static void DeleteDirectoryContentEx(string dirPath)
{
if (Directory.Exists(dirPath))
{
Directory.Delete(dirPath);
Directory.CreateDirectory(dirPath);
}
}
/// <summary>
/// 刪除指定目錄下所有內容:方法二--找到所有文件和子文件夾刪除
/// </summary>
/// <param name="dirPath"></param>
public static void DeleteDirectoryContent(string dirPath)
{
if (Directory.Exists(dirPath))
{
foreach (string content in Directory.GetFileSystemEntries(dirPath))
{
if (Directory.Exists(content))
{
Directory.Delete(content, true);
}
else if (File.Exists(content))
{
File.Delete(content);
}
}
}
}
複製代碼
6.讀取文件
讀取文件方法很多,File類已經封裝了四種:
一、直接使用File類
1.public static string ReadAllText(string path);
2.public static string[] ReadAllLines(string path);
3.public static IEnumerable<string> ReadLines(string path);
4.public static byte[] ReadAllBytes(string path);
以上獲得內容是一樣的,只是返回類型不同罷了,根據自己需要調用。
二、利用流讀取文件
分別有StreamReader和FileStream。詳細內容請看代碼。
複製代碼
//ReadAllLines
Console.WriteLine("--{0}", "ReadAllLines");
List<string> list = new List<string>(File.ReadAllLines(filePath));
list.ForEach(str =>
{
Console.WriteLine(str);
});
//ReadAllText
Console.WriteLine("--{0}", "ReadAllLines");
string fileContent = File.ReadAllText(filePath);
Console.WriteLine(fileContent);
//StreamReader
Console.WriteLine("--{0}", "StreamReader");
using (StreamReader sr = new StreamReader(filePath))
{
//方法一:從流的當前位置到末尾讀取流
fileContent = string.Empty;
fileContent = sr.ReadToEnd();
Console.WriteLine(fileContent);
//方法二:一行行讀取直至爲NULL
fileContent = string.Empty;
string strLine = string.Empty;
while (strLine != null)
{
strLine = sr.ReadLine();
fileContent += strLine+"\r\n";
}
Console.WriteLine(fileContent);
}
複製代碼
7.寫入文件
寫文件內容與讀取文件類似,請參考讀取文件說明。
複製代碼
//WriteAllLines
File.WriteAllLines(filePath,new string[]{"11111","22222","3333"});
File.Delete(filePath);
//WriteAllText
File.WriteAllText(filePath, "11111\r\n22222\r\n3333\r\n");
File.Delete(filePath);
//StreamWriter
using (StreamWriter sw = new StreamWriter(filePath))
{
sw.Write("11111\r\n22222\r\n3333\r\n");
sw.Flush();
}
複製代碼
9.文件路徑
文件和文件夾的路徑操作都在Path類中。另外還可以用Environment類,裏面包含環境和程序的信息。
複製代碼
string dirPath = @"D:\TestDir";
string filePath = @"D:\TestDir\TestFile.txt";
Console.WriteLine("<<<<<<<<<<<{0}>>>>>>>>>>", "文件路徑");
//獲得當前路徑
Console.WriteLine(Environment.CurrentDirectory);
//文件或文件夾所在目錄
Console.WriteLine(Path.GetDirectoryName(filePath)); //D:\TestDir
Console.WriteLine(Path.GetDirectoryName(dirPath)); //D:\
//文件擴展名
Console.WriteLine(Path.GetExtension(filePath)); //.txt
//文件名
Console.WriteLine(Path.GetFileName(filePath)); //TestFile.txt
Console.WriteLine(Path.GetFileName(dirPath)); //TestDir
Console.WriteLine(Path.GetFileNameWithoutExtension(filePath)); //TestFile
//絕對路徑
Console.WriteLine(Path.GetFullPath(filePath)); //D:\TestDir\TestFile.txt
Console.WriteLine(Path.GetFullPath(dirPath)); //D:\TestDir
//更改擴展名
Console.WriteLine(Path.ChangeExtension(filePath, ".jpg"));//D:\TestDir\TestFile.jpg
//根目錄
Console.WriteLine(Path.GetPathRoot(dirPath)); //D:\
//生成路徑
Console.WriteLine(Path.Combine(new string[] { @"D:\", "BaseDir", "SubDir", "TestFile.txt" })); //D:\BaseDir\SubDir\TestFile.txt
//生成隨即文件夾名或文件名
Console.WriteLine(Path.GetRandomFileName());
//創建磁盤上唯一命名的零字節的臨時文件並返回該文件的完整路徑
Console.WriteLine(Path.GetTempFileName());
//返回當前系統的臨時文件夾的路徑
Console.WriteLine(Path.GetTempPath());
//文件名中無效字符
Console.WriteLine(Path.GetInvalidFileNameChars());
//路徑中無效字符
Console.WriteLine(Path.GetInvalidPathChars());
複製代碼
10.文件屬性操作
File類與FileInfo都能實現。靜態方法與實例化方法的區別!
複製代碼
//use File class
Console.WriteLine(File.GetAttributes(filePath));
File.SetAttributes(filePath,FileAttributes.Hidden | FileAttributes.ReadOnly);
Console.WriteLine(File.GetAttributes(filePath));
//user FilInfo class
FileInfo fi = new FileInfo(filePath);
Console.WriteLine(fi.Attributes.ToString());
fi.Attributes = FileAttributes.Hidden | FileAttributes.ReadOnly; //隱藏與只讀
Console.WriteLine(fi.Attributes.ToString());
//只讀與系統屬性,刪除時會提示拒絕訪問
fi.Attributes = FileAttributes.Archive;
Console.WriteLine(fi.Attributes.ToString());
複製代碼
11.移動文件夾中的所有文件夾與文件到另一個文件夾
如果是在同一個盤符中移動,則直接調用Directory.Move的方法即可!跨盤符則使用下面遞歸的方法!
複製代碼
/// <summary>
/// 移動文件夾中的所有文件夾與文件到另一個文件夾
/// </summary>
/// <param name="sourcePath">源文件夾</param>
/// <param name="destPath">目標文件夾</param>
public static void MoveFolder(string sourcePath,string destPath)
{
if (Directory.Exists(sourcePath))
{
if (!Directory.Exists(destPath))
{
//目標目錄不存在則創建
try
{
Directory.CreateDirectory(destPath);
}
catch (Exception ex)
{
throw new Exception("創建目標目錄失敗:" + ex.Message);
}
}
//獲得源文件下所有文件
List<string> files = new List<string>(Directory.GetFiles(sourcePath));
files.ForEach(c =>
{
string destFile = Path.Combine(new string[]{destPath,Path.GetFileName(c)});
//覆蓋模式
if (File.Exists(destFile))
{
File.Delete(destFile);
}
File.Move(c, destFile);
});
//獲得源文件下所有目錄文件
List<string> folders = new List<string>(Directory.GetDirectories(sourcePath));
folders.ForEach(c =>
{
string destDir = Path.Combine(new string[] { destPath, Path.GetFileName(c) });
//Directory.Move必須要在同一個根目錄下移動纔有效,不能在不同卷中移動。
//Directory.Move(c, destDir);
//採用遞歸的方法實現
MoveFolder(c, destDir);
});
}
else
{
throw new DirectoryNotFoundException("源目錄不存在!");
}
}
複製代碼
12.複製文件夾中的所有文件夾與文件到另一個文件夾
如果是需要移動指定類型的文件或者包含某些字符的目錄,只需在Directory.GetFiles中加上查詢條件即可!
複製代碼
/// <summary>
/// 複製文件夾中的所有文件夾與文件到另一個文件夾
/// </summary>
/// <param name="sourcePath">源文件夾</param>
/// <param name="destPath">目標文件夾</param>
public static void CopyFolder(string sourcePath,string destPath)
{
if (Directory.Exists(sourcePath))
{
if (!Directory.Exists(destPath))
{
//目標目錄不存在則創建
try
{
Directory.CreateDirectory(destPath);
}
catch (Exception ex)
{
throw new Exception("創建目標目錄失敗:" + ex.Message);
}
}
//獲得源文件下所有文件
List<string> files = new List<string>(Directory.GetFiles(sourcePath));
files.ForEach(c =>
{
string destFile = Path.Combine(new string[]{destPath,Path.GetFileName(c)});
File.Copy(c, destFile,true);//覆蓋模式
});
//獲得源文件下所有目錄文件
List<string> folders = new List<string>(Directory.GetDirectories(sourcePath));
folders.ForEach(c =>
{
string destDir = Path.Combine(new string[] { destPath, Path.GetFileName(c) });
//採用遞歸的方法實現
CopyFolder(c, destDir);
});
}
else
{
throw new DirectoryNotFoundException("源目錄不存在!");
}
}
複製代碼
總結:
有關文件的操作的內容非常多,不過幾乎都是從上面的這些基礎方法中演化出來的。比如對內容的修改,不外乎就是加上點字符串操作或者流操作。還有其它一些特別的內容,等在開發項目中具體遇到後再添加。