System.IO 命名空間提供豐富的類別操作檔案系統。本文整理最常用的檔案與目錄操作,包含建立、複製、移動、刪除,並示範靜態方法(File、Directory)與實例方法(FileInfo、DirectoryInfo)兩種風格的用法差異。
Directory.CreateDirectory 會建立指定路徑的所有層級目錄,若目錄已存在則不執行任何動作、也不擲回異常:
string folderName = @"c:\Top-Level Folder";
string subFolder = Path.Combine(folderName, "SubFolder");
Directory.CreateDirectory(subFolder); // 安全呼叫,無需先檢查 Exists
string fileName = Path.GetRandomFileName(); // 產生隨機檔名
string filePath = Path.Combine(subFolder, fileName);
if (!File.Exists(filePath))
{
using (FileStream fs = File.Create(filePath))
{
for (byte i = 0; i < 100; i++)
{
fs.WriteByte(i);
}
}
}
else
{
Console.WriteLine($"檔案 \"{fileName}\" 已存在。");
}
try
{
byte[] buffer = File.ReadAllBytes(filePath);
foreach (byte b in buffer)
{
Console.Write(b + " ");
}
Console.WriteLine();
}
catch (IOException e)
{
Console.WriteLine(e.Message);
}
若希望檔案存在時附加資料而非覆寫,可使用 FileStream 建構函式指定 FileMode.Append:
using (FileStream fs = new FileStream(filePath, FileMode.Append))
{
for (byte i = 0; i < 100; i++)
{
fs.WriteByte(i);
}
}
string sourceFile = Path.Combine(sourcePath, "test.txt");
string destFile = Path.Combine(targetPath, "test.txt");
// 第三個參數 true 表示覆寫既有檔案
File.Copy(sourceFile, destFile, true);
if (Directory.Exists(sourcePath))
{
string[] files = Directory.GetFiles(sourcePath);
if (!Directory.Exists(targetPath))
{
Directory.CreateDirectory(targetPath);
}
foreach (string s in files)
{
string fileName = Path.GetFileName(s);
string dest = Path.Combine(targetPath, fileName);
File.Copy(s, dest, true); // 覆寫模式
}
}
else
{
Console.WriteLine("來源路徑不存在!");
}
注意:Directory.GetFiles 預設不遞迴子目錄。若需遞迴,請使用 SearchOption.AllDirectories 或自行實作遞迴走訪。
// 移動檔案
File.Move(@"C:\Users\Public\public\test.txt",
@"C:\Users\Public\private\test.txt");
// 移動整個目錄(含內容)
Directory.Move(@"C:\Users\Public\public\test\",
@"C:\Users\Public\private");
Move 實際上是「重新命名」路徑,來源與目的必須在同一磁碟分割區;跨磁碟需先複製再刪除。
| 特性 | File / Directory | FileInfo / DirectoryInfo |
|---|---|---|
| 呼叫方式 | 靜態方法 | 實例方法 |
| 效能 | 每次呼叫都做安全性檢查 | 建立實例時檢查一次,後續操作較快 |
| 適用場景 | 單次操作 | 同一檔案/目錄多次操作 |
| 路徑處理 | 每次傳入完整路徑 | 實例封裝路徑 |
掌握 System.IO 核心類別的操作模式,能讓您輕鬆處理各種檔案系統需求。記住關鍵原則:
Path.Combine,避免手工串接錯誤。Exists,但需注意競態條件(TOCTOU)。using 確保 FileStream 正確關閉。recursive: true。