命名空間:System.IO。所有方法皆為 static,適合跨平台路徑組合與解析。
| 方法 | 用途 | 範例輸入 | 範例輸出 |
|---|---|---|---|
| ChangeExtension(path, ext) | 變更副檔名 | c:\a.txt, ".log" | c:\a.log |
| Combine(path1, path2) | 智慧合併路徑 (自動處理分隔符) | c:\dir, "file.txt" | c:\dir\file.txt |
| GetDirectoryName(path) | 取得目錄路徑 | c:\dir\file.txt | c:\dir |
| GetExtension(path) | 取得副檔名含點號 | c:\a.txt | .txt |
| GetFileName(path) | 取得檔名含副檔名 | c:\dir\a.txt | a.txt |
| GetFileNameWithoutExtension(path) | 取得純檔名 | c:\dir\a.txt | a |
| GetFullPath(relativePath) | 轉換為絕對路徑 | test.exe | C:\Project\bin\Debug\test.exe |
| GetTempFileName() | 建立暫存檔並回傳完整路徑 | — | C:\Temp\tmp123.tmp |
| GetTempPath() | 取得系統暫存目錄 | — | C:\Temp\ |
| HasExtension(path) | 判斷是否有副檔名 | file.txt | true |
| IsPathRooted(path) | 判斷是否為絕對路徑 | \dir\file | true |
string path = @"C:\Project\data\report.txt";
Console.WriteLine(Path.GetExtension(path)); // .txt
Console.WriteLine(Path.GetFileNameWithoutExtension(path)); // report
path = Path.ChangeExtension(path, ".pdf"); // C:\Project\data\report.pdf
path = Path.Combine(@"C:\Project\data\", "backup", "2024"); // C:\Project\data\backup\2024
Directory:static 方法,單次操作方便。
DirectoryInfo:實例類別,適合對同一目錄執行多次操作,效能較佳。
// 建立目錄 (含多層)
Directory.CreateDirectory(@"C:\Data\Year2024\Month01");
// 判斷存在
if (Directory.Exists(@"C:\Data")) { /* ... */ }
// 刪除目錄
Directory.Delete(@"C:\Data", true); // true = 遞迴刪除非空目錄
// 列舉子目錄
string[] dirs = Directory.GetDirectories(@"C:\Windows", "*", SearchOption.AllDirectories);
// 列舉檔案
string[] files = Directory.GetFiles(@"C:\Windows", "*.ini", SearchOption.TopDirectoryOnly);
// 取得父目錄
DirectoryInfo parent = Directory.GetParent(@"C:\Data\Year2024\Month01"); // C:\Data\Year2024
var di = new DirectoryInfo(@"C:\Data");
Console.WriteLine(di.Name); // Data
Console.WriteLine(di.FullName); // C:\Data
Console.WriteLine(di.Parent); // C:\
Console.WriteLine(di.CreationTime);
Console.WriteLine(di.LastAccessTime);
di.Create(); // 建立
di.Delete(true); // 刪除 (含子項目)
var subDirs = di.GetDirectories(); // DirectoryInfo[]
var subFiles = di.GetFiles("*.log"); // FileInfo[]
File:static 便利方法,預設編碼 UTF-8 (無 BOM)。
FileInfo:實例提供更精細控制 (Stream、權限、屬性)。
// 寫入/覆蓋 (指定編碼避免中文亂碼)
File.WriteAllText(@"C:\log.txt", "中文內容", Encoding.UTF8);
File.WriteAllLines(@"C:\log.txt", new[] { "Line1", "Line2" }, Encoding.UTF8);
// 追加
File.AppendAllText(@"C:\log.txt", "\n新增一行", Encoding.UTF8);
// 讀取
string allText = File.ReadAllText(@"C:\log.txt", Encoding.UTF8);
string[] lines = File.ReadAllLines(@"C:\log.txt", Encoding.UTF8);
// 存在/刪除/複製/移動
if (File.Exists(@"C:\log.txt")) File.Delete(@"C:\log.txt");
File.Copy(@"C:\source.txt", @"C:\dest.txt", true); // true=覆蓋
File.Move(@"C:\old.txt", @"C:\new.txt");
var fi = new FileInfo(@"C:\large.log");
Console.WriteLine($"Size: {fi.Length} bytes");
Console.WriteLine($"Created: {fi.CreationTime}");
// 取得 Stream 手動控制讀寫 (大檔案建議)
using (var fs = fi.OpenRead())
using (var sr = new StreamReader(fs, Encoding.UTF8))
{
string line;
while ((line = sr.ReadLine()) != null) { /* 處理 */ }
}
// 開啟文字寫入器 (自動關閉)
using (var sw = fi.AppendText()) // StreamWriter
{
sw.WriteLine("追加記錄");
}
ReadAllText/WriteAllText 一次載入記憶體,改用 StreamReader/StreamWriter 或 File.OpenRead/OpenWrite 串流處理。Encoding.UTF8 (或 new UTF8Encoding(false) 無 BOM),跨平台相容性最佳。Path.Combine 而非字串連接,自動處理平台分隔符 (\ vs /)。File.ReadAllTextAsync、StreamReader.ReadLineAsync 避免阻塞 UI 執行緒。try-catch 捕捉 IOException、UnauthorizedAccessException、FileNotFoundException。Path.DirectorySeparatorChar 在 Windows 為 \\,Linux/macOS 為 /,Path.Combine 會自動適配。Path.Join (Core 2.1+) 可接受多個片段參數。Path.GetTempPath() 在容器環境可能指向 /tmp,權限需確認。