CodeGym /課程 /C# SELF /建立與刪除檔案

建立與刪除檔案

C# SELF
等級 40 , 課堂 0
開放

1. 介紹

看起來檔案很簡單,手動建立檔案也很容易(例如在 Windows 上右鍵)。但在實際專案中,程式化地建立與刪除檔案是自動化與彈性的關鍵。舉例:

  • 在文字編輯器中使用者按「儲存」— 你的程式會建立新檔案,把使用者的作品寫進去。
  • 事件記錄服務會在應用啟動時自動建立日誌檔案。
  • 壓縮或備份工具會定期建立臨時檔案,之後再刪除它們。
  • C# 的遊戲會做自動存檔 — 建立或覆寫儲存檔。
  • 你(或你的腳本)會自動清理資料夾裡的舊臨時檔案,避免把磁碟塞爆。

能夠自動建立與刪除檔案,是現代 .NET 開發者的基礎技能之一。

2. 使用 File 的快速操作

建立檔案

在 C# 裡有好幾種建立檔案的方法。最快最簡單的是用靜態類別 File。來試試看:


// 在目前目錄建立空的檔案 "myfile.txt"
File.Create("myfile.txt").Close(); // FileStream 需要關閉!
Console.WriteLine("檔案 'myfile.txt' 已建立。");

重要提醒:
方法 File.Create 會回傳一個 FileStream 物件,必須關閉(Close()),不然作業系統會抱怨檔案「被佔用」。如果不關,其他對同一檔案的操作很可能會失敗。這是經典情況:"檔案被其他程序佔用",但那個「其他程序」往往就是你沒關掉的程式本身。

如果該檔案已存在,File.Create 會覆寫它(舊檔被刪掉,新的空檔建立在原來位置)。如果不存在 — 就會被建立。

空檔案有什麼用?

通常我們建立檔案不是為了空著,而是要寫入內容。這種情況有更方便的方法:

File.WriteAllText("welcome.txt", "嗨,檔案世界!");

這行會建立檔案、把字串寫入,並妥善關閉檔案,避免發生問題。

檢查檔案是否存在

在建立新檔案之前,先檢查一下檔案是不是已經存在是個好習慣。否則可能會不小心覆寫重要資料。


if (!File.Exists("important.txt"))
{
    File.WriteAllText("important.txt", "儲存重要資訊。");
    Console.WriteLine("檔案已建立。");
}
else
{
    Console.WriteLine("這個檔案已經存在,可以考慮別的處理方式!");
}

3. 真實例子:「儲存使用者問候」


Console.Write("請輸入你的名字: ");
string name = Console.ReadLine();

string filename = $"{name}_greeting.txt";
string message = $"歡迎, {name}!";

// 檢查是否有相同檔案
if (!File.Exists(filename))
{
    File.WriteAllText(filename, message);
    Console.WriteLine($"已建立個人化問候檔案 {filename}。");
}
else
{
    Console.WriteLine($"檔案 {filename} 已存在!是否覆寫? (y/n)");
    string answer = Console.ReadLine();
    if (answer?.ToLower() == "y")
    {
        File.WriteAllText(filename, message);
        Console.WriteLine($"檔案 {filename} 已覆寫。");
    }
    else
    {
        Console.WriteLine("保持原樣。");
    }
}

我們在做什麼:

  • 檢查檔案是否存在(File.Exists)。
  • 如果不存在 — 建立並寫入文字(File.WriteAllText)。
  • 如果存在 — 詢問使用者是否要覆寫。

4. 刪除檔案

在 C# 裡刪除檔案看起來有點酷,但也很安全!一樣很簡單:

使用 File.Delete

File.Delete("myfile.txt");

如果檔案不存在 — 不會有什麼戲劇性事件發生!只要路徑正確就不會拋錯誤。

新手常踩的坑

  • 如果檔案已被你自己的程式(或其他程式)打開,會拋出例外。
  • 如果路徑寫錯 — 會出現 ArgumentException

建議:養成先檢查存在性的習慣


if (File.Exists("victim.txt"))
{
    File.Delete("victim.txt");
    Console.WriteLine("檔案已刪除。");
}
else
{
    Console.WriteLine("沒有要刪除的東西 — 找不到該檔案。");
}

5. 資料夾與檔案:建立檔案結構

在資料夾中建立檔案


string folder = "Data";
Directory.CreateDirectory(folder); // 如果資料夾不存在就會建立

string filename = Path.Combine(folder, "info.txt");
File.WriteAllText(filename, "這裡存放一則秘密訊息!");

重要: 嘗試在不存在的資料夾建立檔案會拋例外。所以先呼叫 Directory.CreateDirectory(folder)。如果資料夾已存在,這個呼叫也不會再建立一次,因此很安全。

6. 使用實例:FileInfo

對於比較老派或進階的情境,FileInfo 類別會很有用:


FileInfo fi = new FileInfo("example.txt");

// 建立新檔案(和 File.Create 一樣 — 建立空檔)
using (var fs = fi.Create())
{
    // 可以寫入一些東西,如果想的話
}

Console.WriteLine($"用 FileInfo 建立了 'example.txt'。");

透過 FileInfo 刪除:


FileInfo fi = new FileInfo("oldfile.txt");
if (fi.Exists)
{
    fi.Delete();
    Console.WriteLine("已透過 FileInfo 刪除檔案。");
}

FileInfo 的好處

如果你不只做建立/刪除,還會頻繁存取檔案屬性或對同一檔案做多種操作,實例方法會比較方便(有時也會在效能上有小小優勢)。

7. 建立並清理「技術檔案」

假設應用程式在資料夾 "temp_data" 產生臨時檔案,我們想刪掉該資料夾裡所有以 "temp_" 開頭的檔案。


string tempFolder = "temp_data";
Directory.CreateDirectory(tempFolder);

for (int i = 1; i <= 5; i++)
{
    string tempFile = Path.Combine(tempFolder, $"temp_{i}.txt");
    File.WriteAllText(tempFile, $"測試資料 {i}");
}
Console.WriteLine("已建立 5 個臨時檔案。");

// 現在刪除所有 temp_*.txt
foreach (string file in Directory.GetFiles(tempFolder, "temp_*.txt"))
{
    File.Delete(file);
    Console.WriteLine($"已刪除檔案: {file}");
}

很適合用來自動清理舊的臨時檔案。

8. 重要細節:例外與安全性

可能會出錯的地方:

  • 沒有在資料夾寫入/刪除的權限(例如 C:\Windows
  • 檔案已被其他程式(或你自己!)佔用
  • 路徑包含不允許的字元(例如 *?<>
  • 在你檢查和刪除之間,檔案被其他程序刪掉(會發生這種事)

怎麼防護

在「實戰」程式中,這類操作通常會包在 try-catch 裡:


try
{
    File.Delete("trickyfile.txt");
    Console.WriteLine("檔案已刪除。");
}
catch (UnauthorizedAccessException ex)
{
    Console.WriteLine("沒有刪除檔案的權限。");
}
catch (IOException ex)
{
    Console.WriteLine("檔案可能被其他程序佔用。");
}
catch (Exception ex)
{
    Console.WriteLine($"錯誤:{ex.Message}");
}

9. 有用的小提示

那些你應該一直注意的檔案習慣

  • Path.Combine 來組合路徑。這樣就不會出現多餘或缺少的斜線,程式也比較跨平台。
  • 建立/刪除前先檢查檔案是否存在,避免驚喜。
  • 在實際環境中把程式包進 try-catch,尤其是在多人使用或伺服器環境下。
  • 重複對同一檔案做操作時用 FileInfo,一次性的話用 File 就好。
  • 不要把檔案開著超過必要時間。如果檔案打開了,問自己:"那為什麼?",然後把它關掉!能用 using 的地方就用 using

技術速查表

操作 方法 備註
建立空檔案
File.Create
回傳 FileStream,需要關閉它
把文字寫入檔案
File.WriteAllText
建立檔案或覆寫
檢查是否存在
File.Exists
回傳 bool
刪除檔案
File.Delete
若檔案不存在不會拋例外
在資料夾建立檔案
Directory.CreateDirectory + File.WriteAllText
確保資料夾存在
使用 FileInfo
new FileInfo(path).Create / Delete / Exists
適用於多次操作

10. 常見錯誤

錯誤 #1:建立後忘了關閉流(來自 File.Create)。
很多新手用 File.Create 建檔,但忘了關掉回傳的流。結果其他程式碼就看不到檔案了 — 好像跑到平行世界一樣。請顯式關閉流(Close())或用 using

錯誤 #2:試圖在不存在的資料夾建立檔案。
常見陷阱是直接建立檔案在還沒建立的目錄。別忘了事先呼叫 Directory.CreateDirectory。這個呼叫很安全:不會重複建立已存在的資料夾,但會確保需要的資料夾存在。

錯誤 #3:在未檢查的情況下刪除檔案。
有時候直接呼叫 File.Delete 看起來沒問題 — 如果檔案不存在,方法也不會拋例外。但如果路徑錯誤或沒有權限,還是會拋例外。最好預先處理或捕捉例外。

錯誤 #4:把 File.DeleteDirectory.Delete 弄混。
File.Delete 只用於檔案,Directory.Delete 用於資料夾。用 File.Delete 去刪資料夾就像拿牙刷去擦磚頭:技術上不對味,也不適合。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION