掌握C#系統文件
C# 提供了強大的與文件系統互動的能力,使得文件操作、目錄管理和資訊提取等任務得以實現。 在他的影片中,"使用C#進行文件系統管理 - 管理資料夾和文件",Tim Corey 探討了使用 C# 操作文件和目錄的基本原理。
本文旨在提供 C# 文件系統操作的全面概述,重點介紹自動化任務、管理目錄和處理文件的基本技術。
介紹
在 C# 中,System.IO 命名空間提供了強大的類來與文件系統互動。 這些類,如 Directory 和 DirectoryInfo,使您能夠執行多種文件操作,比如建立文件、讀取資料、寫入文件,以及檢查指定路徑中是否已經存在指定文件。 使用這些類,您可以處理文字文件、二進制文件和各種擴展名的文件。 像 Exists() 和 Delete() 這樣的方法允許開發者有效地管理文件和目錄。
例如,File 類包括靜態方法來檢查文件是否已存在、建立新文件,或以不同模式打開文件(如讀取、寫入或追加)。 您還可以使用 FileInfo 類來獲取更多關於文件的詳細資訊,例如它的建立時間或完整路徑。 DirectoryInfo 類允許您操作目錄、獲取文件或建立新目錄。 這些類和方法提供了處理現有文件和新文件的靈活性,管理多個文件,甚至在字節級別處理文件資料,使 C# 成為文件系統操作的強大工具。
Tim 首先突出了 C# 為自動化文件任務提供的強大功能,如建立備份、組織文件和檢索文件資訊。 他在影片中介紹自己的目標是通過實用範例和培訓資源讓學習 C# 變得更簡單。
建立一個示範控制台應用程式
Tim 從零開始,使用 .NET Framework 建立了一個名為 "FileSystemDemo" 的新控制台應用程式。 他強調在此次演示中選擇 .NET Framework 而不是 .NET Core。
using System;
using System.IO;
namespace FileSystemDemo
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
}using System;
using System.IO;
namespace FileSystemDemo
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
}設置根路徑
Tim 在他的系統中為演示設置了一個指向特定目錄的根路徑變數。
string rootPath = @"C:\temp\demos\filesystem";string rootPath = @"C:\temp\demos\filesystem";他解釋說 @ 符號允許在路徑中使用反斜杠而無需對其進行轉義。
讀取路徑中的所有目錄
Tim 演示如何使用 Directory.GetDirectories 方法檢索指定根路徑中的所有目錄。
string[] directories = Directory.GetDirectories(rootPath);
foreach (string directory in directories)
{
Console.WriteLine(directory);
}string[] directories = Directory.GetDirectories(rootPath);
foreach (string directory in directories)
{
Console.WriteLine(directory);
}此程式碼會列印出根目錄內所有子目錄的完整路徑。

遞歸讀取子目錄
為了在搜索中包含子目錄,Tim 在 GetDirectories 方法中新增搜索模式和搜索選項。
string[] allDirectories = Directory.GetDirectories(rootPath, "*", SearchOption.AllDirectories);
foreach (string directory in allDirectories)
{
Console.WriteLine(directory);
}string[] allDirectories = Directory.GetDirectories(rootPath, "*", SearchOption.AllDirectories);
foreach (string directory in allDirectories)
{
Console.WriteLine(directory);
}此修改確保所有巢狀子目錄都包含在搜索中。
讀取路徑中的所有文件
Tim 展示了如何使用 Directory.GetFiles 方法檢索目錄類和指定根路徑中的所有文件。
string[] files = Directory.GetFiles(rootPath, "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
Console.WriteLine(file);
}string[] files = Directory.GetFiles(rootPath, "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
Console.WriteLine(file);
}此程式碼列印出根目錄及其子目錄中所有文件的完整路徑。

提取文件名和路徑
Tim 解釋了如何使用 Path 類提取文件名和路徑。 這包括獲取不帶文件擴展名的文件名和每個文件的目錄名。
foreach (string file in files)
{
Console.WriteLine(Path.GetFileName(file)); // File name with extension
Console.WriteLine(Path.GetFileNameWithoutExtension(file)); // File name without extension
Console.WriteLine(Path.GetDirectoryName(file)); // Directory name
}foreach (string file in files)
{
Console.WriteLine(Path.GetFileName(file)); // File name with extension
Console.WriteLine(Path.GetFileNameWithoutExtension(file)); // File name without extension
Console.WriteLine(Path.GetDirectoryName(file)); // Directory name
}此程式碼片段演示了如何提取並列印指定路徑中文件的不同部分。
檢索文件資訊
Tim 在 (12:10) 演示如何使用 FileInfo 類檢索文件的詳細資訊。 這包括獲取文件大小、最後存取時間、建立時間及其他屬性。
foreach (string file in files)
{
FileInfo info = new FileInfo(file);
Console.WriteLine($"{Path.GetFileName(file)}: {info.Length} bytes");
}foreach (string file in files)
{
FileInfo info = new FileInfo(file);
Console.WriteLine($"{Path.GetFileName(file)}: {info.Length} bytes");
}此程式碼片段列印出文件名及其字節大小。 Tim 提到您可以通過連續除以 1024 將此大小轉換為千字節或兆字節。
他進一步解釋 FileInfo 類提供了其他有用的屬性:
LastWriteTime:文件的最後修改時間。LastAccessTime:文件的最後存取時間。CreationTime:文件的建立時間。Attributes:文件屬性,如只讀或存檔。
Automating File System Tasks with C
Tim 在 (15:11) 討論如何使用 C# 自動化各種文件系統任務。 這可以包含建立目錄、驗證文件或目錄的存在以及其他重複性任務。
驗證目錄是否存在
Tim 演示如何使用 Directory.Exists 方法檢查目錄是否存在。 這對於確保在執行操作之前必需的目錄已就緒非常有用。
string newPath = @"C:\temp\demos\filesystem\subfolderC";
if (Directory.Exists(newPath))
{
Console.WriteLine("Directory exists");
}
else
{
Console.WriteLine("Directory does not exist");
}string newPath = @"C:\temp\demos\filesystem\subfolderC";
if (Directory.Exists(newPath))
{
Console.WriteLine("Directory exists");
}
else
{
Console.WriteLine("Directory does not exist");
}此程式碼檢查目錄的存在並列印出適當的消息。
建立新目錄
Tim 解釋了如何使用 Directory.CreateDirectory 方法建立新目錄。 如果指定路徑中的目錄和子目錄不存在,則此方法會建立它們。
string newPath = @"C:\temp\demos\filesystem\subfolderC\sub-subfolderD";
Directory.CreateDirectory(newPath);
Console.WriteLine("Directories created");string newPath = @"C:\temp\demos\filesystem\subfolderC\sub-subfolderD";
Directory.CreateDirectory(newPath);
Console.WriteLine("Directories created");Tim 演示了此方法建立指定路徑及其子目錄而不覆蓋任何現有文件或目錄。
複製文件
Tim 在 (21:35) 演示如何使用 File.Copy 方法將文件從一個目錄複製到另一個目錄。 這對於備份文件或將文件組織到不同資料夾非常有用。
string[] files = Directory.GetFiles(rootPath);
string destinationFolder = Path.Combine(rootPath, "subfolderA");
foreach (string file in files)
{
string destFile = Path.Combine(destinationFolder, Path.GetFileName(file));
File.Copy(file, destFile, true);
}string[] files = Directory.GetFiles(rootPath);
string destinationFolder = Path.Combine(rootPath, "subfolderA");
foreach (string file in files)
{
string destFile = Path.Combine(destinationFolder, Path.GetFileName(file));
File.Copy(file, destFile, true);
}在此例中,文件從根目錄複製到 subfolderA,由於 true 參數已存在的文件將被覆蓋。
在複製期間重命名文件
Tim 还展示了如何通過使用帶索引的 for 迴圈在複製過程中重命名文件。
for (int i = 0; i < files.Length; i++)
{
string destFile = Path.Combine(destinationFolder, $"{i}.txt");
File.Copy(files[i], destFile, true);
}for (int i = 0; i < files.Length; i++)
{
string destFile = Path.Combine(destinationFolder, $"{i}.txt");
File.Copy(files[i], destFile, true);
}此程式碼將文件複製到目標目錄並依次重命名為 1.txt 等。
處理文件覆蓋
Tim 解釋如何處理現有文件而不進行覆蓋,並通過對覆蓋參數設置為 false 來避免異常。 這可以防止覆寫現有文件,並在文件已存在時引發異常。
try
{
File.Copy(sourceFile, destFile, false);
}
catch (IOException ex)
{
Console.WriteLine($"File already exists: {ex.Message}");
}try
{
File.Copy(sourceFile, destFile, false);
}
catch (IOException ex)
{
Console.WriteLine($"File already exists: {ex.Message}");
}此方法有助於安全管理文件複製及處理不應覆寫文件的情況。
移動文件
Tim 在 (28:28) 演示如何使用 File.Move 方法移動文件。 與 File.Copy 不同,File.Move 方法沒有覆蓋選項,如果目標文件已存在,則會拋出異常。
string[] files = Directory.GetFiles(rootPath);
string destinationFolder = Path.Combine(rootPath, "subfolderA");
foreach (string file in files)
{
string destFile = Path.Combine(destinationFolder, Path.GetFileName(file));
File.Move(file, destFile);
}string[] files = Directory.GetFiles(rootPath);
string destinationFolder = Path.Combine(rootPath, "subfolderA");
foreach (string file in files)
{
string destFile = Path.Combine(destinationFolder, Path.GetFileName(file));
File.Move(file, destFile);
}此程式碼將文件從根目錄移動到 subfolderA 並從源目錄中刪除它們。
建立實用應用程式
Tim 鼓勵開發者思考各種使用 C# 自動化文件系統任務和建立實用應用程式的方法。 他建議從簡單任務開始,並逐步構建更複雜的自動化解決方案。
實用應用程式的例子:
清理臨時文件:自動執行刪除臨時文件的過程來釋放空間。
備份到外接硬碟:建立一個備份工具將重要文件複製到外接硬碟。
- 專案資料夾同步:將專案資料夾在電腦和隨身碟之間進行同步,確保最近的更改總是被備份和還原。
結論
Tim Corey 對 C# 文件系統操作的探索提供了自動化文件任務和目錄管理的實用見解。 通過遵循他的範例,開發者可以有效地自動化例行文件管理任務並建立定制實用應用程式。
為了更深入了解並看到這些概念的實際應用,我強烈建議您觀看 Tim Corey 關於 C# 文件系統 的完整影片。 他詳細的講解和實用的範例將幫助您鞏固理解並授權您建立自己的文件管理應用程式。

