掌握 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's 完整影片《File System in C#》。 他的詳細指南和實際例子將幫助您鞏固理解並支持您建立自己的檔案管理應用程式。
