命名空間與核心類別
using System.IO;
// 核心類別:
// File - 靜態檔案操作
// FileInfo - 實例檔案操作(可重複使用、提供屬性)
// Directory - 靜態目錄操作
// DirectoryInfo - 實例目錄操作
// Path - 路徑字串處理(跨平台安全)
13 大高頻操作場景
1. 相對路徑轉絕對路徑
// ASP.NET Core / .NET 6+
string absolute = Path.GetFullPath(relativePath); // 跨平台
// 舊版 ASP.NET (System.Web)
string absolute = HttpContext.Current.Server.MapPath("~/App_Data/file.txt");
2. 檔案移動/重命名
File.Move(sourcePath, destPath, overwrite: true); // .NET Core 3.0+ 支援覆寫
// 或
new FileInfo(sourcePath).MoveTo(destPath, overwrite: true);
3. 檔案複製
File.Copy(source, dest, overwrite: true);
// 大檔案建議分塊複製或用 FileStream 避免記憶體壓力
4. 檢查檔案是否存在
bool exists = File.Exists(fullPath);
// 注意:回傳 true 不代表可讀寫,仍需 try-catch 處理權限/鎖定
5. 檢查目錄是否存在
bool exists = Directory.Exists(fullPath);
6. 建立目錄(含多層)
Directory.CreateDirectory(fullPath); // 靜態方法:不存在才建立,存在不報錯
// 回傳 DirectoryInfo 可鏈結操作
var di = Directory.CreateDirectory(@"C:\Data\Logs\2024");
7. 目錄移動/重命名
Directory.Move(sourceDir, destDir); // 目標不可存在
// 跨磁碟移動會拋出例外,需改用複製+刪除
8. 讀取文字檔(小檔案)
// 一次性讀完(小檔案)
string content = File.ReadAllText(path, Encoding.UTF8);
// 逐行讀取(記憶體友善)
foreach (string line in File.ReadLines(path, Encoding.UTF8))
{
Process(line);
}
// 手動控制(需精確編碼/大檔案)
using var sr = new StreamReader(path, Encoding.UTF8);
string all = sr.ReadToEnd();
9. 寫入文字檔
// 覆寫寫入
File.WriteAllText(path, content, Encoding.UTF8);
// 追加寫入
File.AppendAllText(path, newLine + Environment.NewLine, Encoding.UTF8);
// 逐行寫入
File.WriteAllLines(path, lines, Encoding.UTF8);
// 手動控制
using var sw = new StreamWriter(path, append: false, Encoding.UTF8);
sw.WriteLine(line);
10. 刪除檔案(安全模式)
if (File.Exists(path))
{
try
{
File.Delete(path);
}
catch (IOException ex) when (ex.HResult == 0x80070020) // 檔案被鎖定
{
// 記錄日誌、稍後重試或通知使用者
}
}
11. 遞迴遍歷目錄
// 現代寫法:EnumerateFiles 逐步產生,不載入全部陣列
foreach (string file in Directory.EnumerateFiles(root, "*.cs", SearchOption.AllDirectories))
{
Console.WriteLine(file);
}
// 需要目錄資訊時
foreach (var dir in Directory.EnumerateDirectories(root, "*", SearchOption.AllDirectories))
{
Console.WriteLine($"目錄:{dir}");
}
// 完整資訊
foreach (var fi in new DirectoryInfo(root).EnumerateFiles("*", SearchOption.AllDirectories))
{
Console.WriteLine($"{fi.FullName} {fi.Length:N0} bytes {fi.LastWriteTime:yyyy-MM-dd HH:mm}");
}
12. 取得檔案修改時間
DateTime lastWrite = File.GetLastWriteTime(path); // 本地時間
DateTime lastWriteUtc = File.GetLastWriteTimeUtc(path); // UTC 時間
// 或用 FileInfo 取得更多屬性
var fi = new FileInfo(path);
Console.WriteLine($"建立:{fi.CreationTime} 修改:{fi.LastWriteTime} 存取:{fi.LastAccessTime}");
13. 從完整路徑提取檔名/副檔名/目錄
string full = @"C:\Data\Report\2024_Q1.pdf";
Path.GetFileName(full); // "2024_Q1.pdf"
Path.GetFileNameWithoutExtension(full); // "2024_Q1"
Path.GetExtension(full); // ".pdf"
Path.GetDirectoryName(full); // "C:\Data\Report"
Path.GetFullPath("..\\config.json"); // 解析相對路徑
Path.Combine("C:\\Data", "Logs", "app.log"); // 安全組合路徑
進階主題:大檔案、權限、跨平台
大檔案處理策略
| 場景 | 建議做法 |
| 逐行處理文字 | File.ReadLines (流式、不載入記憶體) |
| 二進位分塊讀寫 | FileStream + buffer (64KB~1MB) |
| 複製大檔案 | File.Copy (OS 層面優化) 或 FileStream.CopyToAsync |
| 隨機存取修改 | FileStream.Seek + Read/Write |
| 記憶體對映 | MemoryMappedFile (超大檔、進程間共享) |
跨平台路徑處理
// 錯誤:硬編碼分隔符
string bad = "C:\\Data\\file.txt";
// 正確:Path.Combine 自動使用平台分隔符
string good = Path.Combine("C:", "Data", "file.txt"); // Windows: C:\Data\file.txt
// Linux: C:/Data/file.txt
// 取得暫存目錄
string temp = Path.GetTempPath(); // Windows: %TEMP% Linux: /tmp
// 產生唯一暫存檔名
string unique = Path.GetRandomFileName(); // "abc123de.tmp"
string tempFile = Path.Combine(Path.GetTempPath(), unique);
檔案系統監視器
using var watcher = new FileSystemWatcher(@"C:\WatchDir")
{
Filter = "*.txt",
NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.Size,
EnableRaisingEvents = true
};
watcher.Created += (s, e) => Log($"新增:{e.FullPath}");
watcher.Changed += (s, e) => Log($"異動:{e.FullPath} ({e.ChangeType})");
watcher.Deleted += (s, e) => Log($"刪除:{e.FullPath}");
watcher.Renamed += (s, e) => Log($"重命名:{e.OldFullPath} -> {e.FullPath}");
總結:選對類別,事半功倍
| 需求 | 推薦 API |
| 一次性簡單操作 | File / Directory 靜態方法 |
| 重複操作同一檔案/目錄 | FileInfo / DirectoryInfo 實例 |
| 路徑字串處理 | Path 靜態方法 |
| 大檔案/二進位/隨機存取 | FileStream |
| 文字編碼控制 | StreamReader/Writer 指定 Encoding |
| 目錄監控 | FileSystemWatcher |
牢記:永遠用 using 管理資源、指定 Encoding.UTF8、預期例外發生時優雅處理,這才是專業 C# 開發者的檔案操作基本功。