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。
技術速查表
| 操作 | 方法 | 備註 |
|---|---|---|
| 建立空檔案 | |
回傳 FileStream,需要關閉它 |
| 把文字寫入檔案 | |
建立檔案或覆寫 |
| 檢查是否存在 | |
回傳 bool |
| 刪除檔案 | |
若檔案不存在不會拋例外 |
| 在資料夾建立檔案 | |
確保資料夾存在 |
| 使用 FileInfo | |
適用於多次操作 |
10. 常見錯誤
錯誤 #1:建立後忘了關閉流(來自 File.Create)。
很多新手用 File.Create 建檔,但忘了關掉回傳的流。結果其他程式碼就看不到檔案了 — 好像跑到平行世界一樣。請顯式關閉流(Close())或用 using。
錯誤 #2:試圖在不存在的資料夾建立檔案。
常見陷阱是直接建立檔案在還沒建立的目錄。別忘了事先呼叫 Directory.CreateDirectory。這個呼叫很安全:不會重複建立已存在的資料夾,但會確保需要的資料夾存在。
錯誤 #3:在未檢查的情況下刪除檔案。
有時候直接呼叫 File.Delete 看起來沒問題 — 如果檔案不存在,方法也不會拋例外。但如果路徑錯誤或沒有權限,還是會拋例外。最好預先處理或捕捉例外。
錯誤 #4:把 File.Delete 和 Directory.Delete 弄混。
File.Delete 只用於檔案,Directory.Delete 用於資料夾。用 File.Delete 去刪資料夾就像拿牙刷去擦磚頭:技術上不對味,也不適合。
GO TO FULL VERSION