.NET 在 System.IO 命名空間提供豐富的檔案操作類別:
File:靜態方法,一次性操作(建立、複製、刪除、開啟)FileInfo:執行個體方法,適合多次操作同一檔案StreamWriter / StreamReader:文字串流寫入/讀取FileStream:位元組層級隨機存取Path:跨平台路徑處理using System;
using System.IO;
public class FileCreator
{
public static void CreateTextFile(string path, params string[] lines)
{
// using 確保自動關閉與釋放資源
using (StreamWriter writer = File.CreateText(path))
{
foreach (var line in lines)
{
writer.WriteLine(line);
}
}
Console.WriteLine($"檔案已建立: {path}");
}
}
// 呼叫
FileCreator.CreateTextFile(@"C:\Temp\MyTextFile.txt",
"God is greatest of them all",
"This is second line");
File.CreateText 回傳 StreamWriter,預設 UTF-8 編碼using 區塊等同 try/finally 呼叫 Dispose()@ 字串常值避免跳脫字元問題public static void ReadTextFile(string path)
{
if (!File.Exists(path))
{
Console.WriteLine("檔案不存在");
return;
}
using (StreamReader reader = File.OpenText(path))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
// 一次讀取所有行(小檔案適用)
string[] allLines = File.ReadAllLines(path, Encoding.UTF8);
// 一次讀取整個內容
string content = File.ReadAllText(path);
// 非同步讀取(.NET 4.5+,避免阻塞 UI 執行緒)
string contentAsync = await File.ReadAllTextAsync(path);
public static void AppendToFile(string path, string content)
{
// File.AppendText 開啟檔案並移至末尾
using (StreamWriter writer = File.AppendText(path))
{
writer.WriteLine(content);
}
Console.WriteLine("內容已附加");
}
// 呼叫
AppendToFile(@"C:\Temp\MyTextFile.txt", "This Line Is Appended");
// 寫入指定編碼
using (var writer = new StreamWriter(path, false, Encoding.GetEncoding("big5")))
{
writer.WriteLine("繁體中文內容");
}
// 讀取指定編碼
using (var reader = new StreamReader(path, Encoding.GetEncoding("big5")))
{
string text = reader.ReadToEnd();
}
// 使用 FileStream + StreamReader/Writer 手動控制緩衝區大小
const int BufferSize = 64 * 1024; // 64KB
using (var fs = new FileStream(largeFile, FileMode.Open, FileAccess.Read, FileShare.Read, BufferSize))
using (var reader = new StreamReader(fs, Encoding.UTF8, true, BufferSize))
{
string line;
while ((line = reader.ReadLine()) != null)
{
// 處理每一行...
}
}
public async Task WriteLargeFileAsync(string path, IEnumerable data)
{
using (var writer = new StreamWriter(path, false, Encoding.UTF8, 4096))
{
foreach (var line in data)
{
await writer.WriteLineAsync(line);
}
}
}
public static void AtomicWrite(string targetPath, string content)
{
string tempPath = Path.GetTempFileName();
try
{
File.WriteAllText(tempPath, content, Encoding.UTF8);
// Replace 原子性取代目標檔案(Windows 支援)
File.Replace(tempPath, targetPath, null, true);
}
finally
{
if (File.Exists(tempPath)) File.Delete(tempPath);
}
}
// 組合路徑(自動處理分隔符號)
string fullPath = Path.Combine(baseDir, "sub", "file.txt");
// 取得副檔名、檔名、目錄
string ext = Path.GetExtension(fullPath); // ".txt"
string name = Path.GetFileNameWithoutExtension(fullPath); // "file"
string dir = Path.GetDirectoryName(fullPath);
// 取得特殊資料夾
string docs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string temp = Path.GetTempPath();
| 例外類型 | 常見原因 |
|---|---|
FileNotFoundException | 檔案不存在 |
DirectoryNotFoundException | 目錄路徑無效 |
UnauthorizedAccessException | 權限不足、檔案被鎖定 |
IOException | 磁碟空間不足、網路中斷、共用違規 |
PathTooLongException | 路徑超過 260 字元(可啟用長路徑支援) |
try
{
File.Copy(src, dest, true);
}
catch (UnauthorizedAccessException ex)
{
Log.Error("權限不足", ex);
throw new ApplicationException("無法存取檔案,請檢查權限", ex);
}
catch (IOException ex) when ((ex.HResult & 0xFFFF) == 32) // ERROR_SHARING_VIOLATION
{
Log.Error("檔案被其他程式佔用", ex);
// 可重試邏輯...
}
C# 檔案操作核心在於:善用 using 區塊管理資源、明確指定編碼、大檔案用串流、UI 執行緒用非同步、關鍵資料用原子性寫入。掌握 File/FileInfo、StreamReader/Writer、FileStream 等類別的適用場景,即能高效、安全地處理各類檔案 I/O 需求。