在C#中,使用File
和Directory
類可以輕松地創(chuàng)建和刪除文件及目錄。開發(fā)者應(yīng)了解如何使用這兩個類的方法。
案例如下:
// 創(chuàng)建文件
File.Create("path/to/file.txt");
// 刪除文件
File.Delete("path/to/file.txt");
// 創(chuàng)建目錄
Directory.CreateDirectory("path/to/directory");
// 刪除目錄
Directory.Delete("path/to/directory", true); // 第二個參數(shù)表示是否遞歸刪除子目錄和文件
2、文件讀寫操作
C#提供了強大的文件讀寫功能,開發(fā)者需要熟悉StreamReader和StreamWriter等類,以實現(xiàn)對文件的讀寫操作。
下面是一個簡單的例子:
// 讀取文件內(nèi)容
using (StreamReader reader = new StreamReader("path/to/file.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
// 寫入文件內(nèi)容
using (StreamWriter writer = new StreamWriter("path/to/file.txt"))
{
writer.WriteLine("Hello, C# File I/O!");
}
3、文件復(fù)制和移動
在處理文件時,復(fù)制和移動是常見的操作。C#提供了File.Copy和File.Move等方法,可以輕松實現(xiàn)文件的復(fù)制和移動:
// 復(fù)制文件
File.Copy("source/path/file.txt", "destination/path/file.txt");
// 移動文件
File.Move("old/path/file.txt", "new/path/file.txt");
4、文件信息和屬性
使用FileInfo類可以獲取文件的詳細(xì)信息和屬性,例如文件大小、創(chuàng)建時間等:
FileInfo fileInfo = new FileInfo("path/to/file.txt");
Console.WriteLine($"File Size: {fileInfo.Length} bytes");
Console.WriteLine($"Creation Time: {fileInfo.CreationTime}");
5、目錄遍歷
了解如何遍歷目錄以獲取文件列表是一個重要的技能。Directory類提供了GetFiles`和GetDirectories方法,可以返回指定目錄下的文件和子目錄。
案例如下:
// 獲取所有文件
string[] files = Directory.GetFiles("path/to/directory");
// 獲取所有子目錄
string[] directories = Directory.GetDirectories("path/to/directory");
6、異常處理
在進行文件系統(tǒng)I/O操作時,處理可能發(fā)生的異常是不可或缺的??赡艿漠惓0ㄎ募淮嬖?、權(quán)限不足等。使用try-catch塊來捕獲這些異常,以確保應(yīng)用程序的穩(wěn)定性。
try
{
// 文件操作代碼
}
catch (IOException ex)
{
Console.WriteLine($"An IO exception occurred: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"Unauthorized access: {ex.Message}");
}
7、文件存在性檢查
在C#可以使用File.Exists
方法檢查文件是否存在。
if (File.Exists("path/to/file.txt")){// 文件存在,執(zhí)行相應(yīng)操作}
8、路徑操作
路徑對于讀取自定義配置文件等有非常重要的作用。在C#可以使用Path
類來進行路徑的合并、獲取文件名等操作。
codestring fullPath = Path.Combine("folder", "subfolder", "file.txt");
string fileName = Path.GetFileName(fullPath);
9、異步文件讀寫
可以利用C#中的StreamReader
和StreamWriter
的異步方法,實現(xiàn)異步文件讀寫操作。
// 異步讀取文件
using (StreamReader reader = new StreamReader("path/to/file.txt"))
{
string content = await reader.ReadToEndAsync();
Console.WriteLine(content);
}
// 異步寫入文件
using (StreamWriter writer = new StreamWriter("path/to/file.txt"))
{
await writer.WriteLineAsync("Hello, C# File I/O!");
}
10、 特殊文件夾路徑獲取
可以使用Environment.SpecialFolder
枚舉和Environment.GetFolderPath
方法獲取特殊文件夾的路徑。下面案例是獲取桌面文件路徑。
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
Console.WriteLine($"Desktop Path: {desktopPath}");
11、文件屬性設(shè)置
使用File.SetAttributes
方法設(shè)置文件屬性,例如將文件設(shè)置為只讀等。案例如下:
File.SetAttributes("path/to/file.txt", FileAttributes.ReadOnly);
12、文件鎖定檢查
大家常常會遇到文件鎖定的問題不能讀寫文件,在C#中可以用以下方法檢查文件是否被其他進程鎖定。
private static bool IsFileLocked(string filePath)
{
try
{
using (FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
// 文件未被鎖定
return false;
}
}
catch (IOException)
{
// 文件被鎖定
return true;
}
}
//調(diào)用bool isFileLocked = IsFileLocked("path/to/file.txt");
//當(dāng)然還有其它方法,見文章:《C#判斷文件是否占用的2種方法》
13、文件流操
使用FileStream
進行文件流操作,例如讀取和寫入文件。
using (FileStream fs = new FileStream("path/to/file.txt", FileMode.Open, FileAccess.Read))
{
// 執(zhí)行文件流操作
}
14、監(jiān)視文件變化
在C#中可以使用FileSystemWatcher
類監(jiān)視文件變化,例如文件內(nèi)容的修改。
FileSystemWatcher watcher = new FileSystemWatcher("path/to/directory");
watcher.EnableRaisingEvents = true;
watcher.Changed += (sender, e) => Console.WriteLine($"File {e.FullPath} changed");
15、文件內(nèi)容比較
怎么比較兩個文件呢?可以使用File.ReadAllBytes方法轉(zhuǎn)換成字節(jié),然后用SequenceEqual方法來比較兩個文件是否相同。案例如下:
private static bool FileEquals(string filePath1, string filePath2)
{
byte[] file1 = File.ReadAllBytes(filePath1);
byte[] file2 = File.ReadAllBytes(filePath2); return file1.SequenceEqual(file2);
}
//調(diào)用bool areFilesEqual = FileEquals("file1.txt", "file2.txt");
16、文件壓縮與解壓縮
在c#中可以使用ZipFile
類進行文件壓縮和解壓縮操作,目前官方只支持zip文件。案例如下:
ZipFile.CreateFromDirectory("source/path", "archive.zip");ZipFile.ExtractToDirectory("archive.zip", "destination/path");
17、文件路徑規(guī)范化(文件路徑)
使用Path.GetFullPath
方法規(guī)范化文件路徑,解析相對路徑等。在項目中可以獲取完整路徑。
string normalizedPath = Path.GetFullPath("path/to/../file.txt");
18、使用MemoryMappedFile進行內(nèi)存映射文件操作
利用MemoryMappedFile
進行大文件的內(nèi)存映射操作,提高文件讀寫性能。
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile("path/to/file.txt"))
{
// 執(zhí)行內(nèi)存映射文件操作
}
19、文件流異步操作
使用FileStream
的異步方法進行文件流的異步讀寫操作。
using (FileStream fs = new FileStream("path/to/file.txt", FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[1024]; int bytesRead = await fs.ReadAsync(buffer, 0, buffer.Length); // 處理讀取的數(shù)據(jù)
}
20、使用TransactionScope進行文件事務(wù)操作
使用TransactionScope
進行多個文件操作的事務(wù)管理,確保一組文件操作要么全部成功,要么全部失敗。
using (TransactionScope scope = new TransactionScope())
{
File.Move("old/path/file.txt", "new/path/file.txt");
// 其他事務(wù)操作
scope.Complete();
}
結(jié)語
掌握這些C#文件系統(tǒng)I/O知識點對于.NET開發(fā)者來說是至關(guān)重要的。通過靈活運用這些知識,開發(fā)者能夠更加高效地處理文件和目錄,確保應(yīng)用程序的可靠性和性能。在日常開發(fā)中,不斷深入學(xué)習(xí)和實踐這些知識,將有助于提高開發(fā)者的文件系統(tǒng)操作技能。