| 特性 | File(靜態類別) | FileInfo(實例類別) |
|---|---|---|
| 實例化 | 不可實例化,全靜態方法 | 需建立實例 new FileInfo(path) |
| 效能 | 單次操作效率較高(內部快取安全檢查) | 重複操作同一檔案效率較高(避免重複安全檢查) |
| 適用場景 | 一次性檔案處理 | 同一檔案多次讀寫/屬性存取 |
| 路徑參數 | 每次呼叫需傳路徑 | 建構時綁定路徑 |
FileInfo fi = new FileInfo(@"C:\abc.txt");
Console.WriteLine($"存在: {fi.Exists}");
Console.WriteLine($"長度: {fi.Length} bytes");
Console.WriteLine($"建立時間: {fi.CreationTime}");
Console.WriteLine($"最後存取: {fi.LastAccessTime}");
Console.WriteLine($"最後寫入: {fi.LastWriteTime}");
Console.WriteLine($"完整路徑: {fi.FullName}");
Console.WriteLine($"目錄: {fi.DirectoryName}");
Console.WriteLine($"副檔名: {fi.Extension}");
Console.WriteLine($"唯讀: {fi.IsReadOnly}");
Console.WriteLine($"屬性: {fi.Attributes}");

FileInfo fi = new FileInfo(@"C:\abc.txt");
if (!fi.Exists) fi.Create().Close(); // 建立空檔
using (FileStream fs = new FileStream(fi.FullName, FileMode.Open))
using (StreamReader sr = new StreamReader(fs))
{
string line;
while ((line = sr.ReadLine()) != null)
Console.WriteLine(line);
}

using 區塊確保串流正確釋放(即使發生例外)FileMode.Open 要求檔案必須存在StreamReader.ReadLine() 回傳 null 表示結尾設計理念與 File/FileInfo 完全對應:
DirectoryInfo di = new DirectoryInfo(@"C:\MyDir");
if (!di.Exists) di.Create(); // 建立目錄
di.Delete(); // 刪除空目錄
di.Delete(true); // 遞刪非空目錄
di.MoveTo(@"C:\NewPath"); // 移動/重命名
// 列舉子目錄與檔案
foreach (var subDir in di.GetDirectories())
Console.WriteLine(subDir.FullName);
foreach (var file in di.GetFiles())
Console.WriteLine($"{file.Name} ({file.Length} bytes)");

// 取得上傳檔案資訊
string fileName = FileUpload.FileName;
string ext = Path.GetExtension(fileName).ToLower().TrimStart('.');
long size = FileUpload.FileBytes.Length;
// 驗證副檔名與大小
string[] allowed = { "rar", "doc", "txt", "pdf" };
if (allowed.Contains(ext) && size <= 50 * 1024 * 1024)
{
// 目標儲存目錄
DirectoryInfo saveDir = new DirectoryInfo(Server.MapPath("~/fileupload/"));
if (!saveDir.Exists) saveDir.Create(); // Directory.CreateDirectory 同效
// 儲存檔案
string savePath = Path.Combine(saveDir.FullName, fileName);
FileUpload.SaveAs(savePath); // 或使用 FileStream 手動寫入
}
| FileMode | 行為 | 檔案不存在 | 檔案存在 |
|---|---|---|---|
CreateNew | 建立新檔 | 建立 | 拋例外 |
Create | 建立或覆寫 | 建立 | 截斷為 0 位元組 |
Open | 開啟現有 | 拋例外 | 開啟 |
OpenOrCreate | 開啟或建立 | 建立 | 開啟 |
Truncate | 開啟並清空 | 拋例外 | 截斷為 0 |
Append | 開啟並定位到末尾 | 建立 | 定位到末尾 |
掌握 File/FileInfo、Directory/DirectoryInfo 四大核心類別的定位差異,配合 FileStream、StreamReader/Writer 串流管道,即可處理 90% 以上的檔案系統操作需求。記住:單次用靜態,重複用實例;善用 using 區塊管理資源;FileMode 選擇決定資料安全。