CodeGym /課程 /C# SELF /檢查檔案/資料夾是否存在

檢查檔案/資料夾是否存在

C# SELF
等級 38 , 課堂 2
開放

1. 介紹

為什麼要檢查檔案或資料夾是否存在?

想像你在寫日記,你的應用支援將記錄附加到檔案末尾。只要檔案存在一切正常。但如果檔案被誤刪,程式就會拋錯,所有你關於人生意義的靈光一閃,或者最糟只是關於天氣的感想,都會無影無蹤。同理,如果你要建立新檔案以免資料遺失,最好先確認這個檔案還不存在。

在真實專案中——尤其是企業或工業級開發——提前檢查檔案和資料夾的存在性不只可以避免使用者造成的錯誤和致命故障,還能為團隊節省大量時間和精力,而且很重要的一點是,減少不必要的頭痛。

在 .NET 中操作檔案系統

在 .NET 平台上工作檔案和資料夾時,常用到以下主要類別(它們都在命名空間 System.IO 裡):

  • File — 用於檔案操作的 static 方法:檢查、複製、刪除等等。
  • Directory — 用於資料夾操作的 static 方法。

要檢查存在性,只需要兩個方法:

  • File.Exists(path) — 如果檔案存在則回傳 true
  • Directory.Exists(path) — 如果資料夾存在則回傳 true

2. 在開啟前檢查檔案是否存在

實際例子

比方說,你新增了一個顯示日記內容的功能:

string diaryPath = "diary.txt";
        
if (File.Exists(diaryPath))
{
    // 檔案存在,讀取並輸出內容
    using var reader = new StreamReader(diaryPath);
    string content = reader.ReadToEnd();
    Console.WriteLine("你的日記:\n" + content);
}
else
{
    Console.WriteLine("找不到日記檔案!");
    // 如果需要,可以立即建立新檔案
    File.WriteAllText(diaryPath, "這是你日記的開頭。\n");
    Console.WriteLine("已建立新的日記檔案。");
}

在真實專案中這種做法是 must-have:你不寄望「奇蹟」,而是自己掌控狀況。

3. 在寫入前檢查檔案是否存在

情境:應用按計畫產生報告。要確保每個新報告不會覆蓋前一個。

為此最好先檢查:檔案可能已經存在。若是,像是可以請使用者輸入另一個名稱或建立具有唯一名稱的檔案。

string reportPath = "report.txt";
        
if (File.Exists(reportPath))
{
    Console.WriteLine($"檔案 '{reportPath}' 已經存在。請重新命名或刪除舊檔案。");
}
else
{
    using var writer = new StreamWriter(reportPath);
    writer.WriteLine("這是今天的新報告!");
    Console.WriteLine("報告檔案已成功建立。");
}

這樣的檢查可以避免使用者(和你自己!)被檔案被覆蓋的討厭驚喜。

4. 在寫入前檢查資料夾是否存在

檔案很少直接放在專案根目錄。常見會放在專門的資料夾:logs/reports/data/ 等等。寫入前應確認目標資料夾存在。

string logsDir = "logs";
string logPath = Path.Combine(logsDir, "log.txt"); // Path.Combine 幫你安全地連接路徑部分
        
if (!Directory.Exists(logsDir))
{
    Console.WriteLine("找不到 'logs' 資料夾。正在建立...");
    Directory.CreateDirectory(logsDir);
}

using var writer = new StreamWriter(logPath, append: true);
writer.WriteLine($"[{DateTime.Now}] 應用已啟動。");
Console.WriteLine("已成功寫入日誌檔案。");

順便一提,方法 Directory.CreateDirectory 在資料夾已存在時不會拋錯——它會直接忽略,所以如果你接受這種做法,其實可以不先做 Exists 檢查。

5. 重要細節

相對路徑和絕對路徑的特性

新手常犯的錯是混淆相對路徑與絕對路徑。例如,當你寫 File.Exists("data.txt") 時,程式會在當前工作目錄中尋找檔案。那是哪裡?取決於應用是從哪裡啟動的。

為了穩妥,使用絕對路徑或透過 Path.Combine 構建路徑:

string myDocs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string filePath = Path.Combine(myDocs, "myapp", "settings.txt");

路徑被明確指定,你就不會找不到檔案。

檢查時的重要細節

  • 有時會做檢查,但緊接著對同一檔案/資料夾做後續操作。在 File.Exists 與隨後的建立/刪除之間可能會有時間差,其他程序可能改變狀態。在關鍵場景中,請加入使用 try-catch 的錯誤處理。
  • 除了檢查存在性,還要檢查存取權限。有時檔案存在,但使用者沒有權限存取它。
  • 對於目錄請使用 Directory.Exists,不要用 File.Exists ——否則會永遠得到 false
  • 如果路徑包含多層巢狀目錄,例如 "data/2024/04",那麼 Directory.CreateDirectory("data/2024/04") 會建立整個鏈,這很方便也省去了多餘的檢查。

如果不檢查會怎樣?

若你嘗試開啟不存在的檔案來讀取——會得到 FileNotFoundException。若你嘗試在不存在的資料夾中建立檔案——會得到 DirectoryNotFoundException。如果程式在使用者環境下運行,使用者會看到錯誤並且不爽。在生產環境中——你會損失資料/金錢/時間。所以「檢查是否存在」不是唸經式的謹慎,而是對使用者(和你自己腦袋平靜)的關懷。

2
任務
C# SELF, 等級 38, 課堂 2
上鎖
檢查目錄是否存在並在其中建立檔案
檢查目錄是否存在並在其中建立檔案
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION