System.IO 命名空間提供檔案系統操作的核心類別。本文系統整理 File、FileInfo、Directory、DirectoryInfo 四大類別的關鍵方法與屬性,並附上實戰程式碼範例,作為開發檔案管理功能的快速參考手冊。
File 提供靜態方法,適合單次操作;FileInfo 提供實例屬性/方法,適合對同一檔案重複操作(效能較佳,避免重複安全性檢查)。
public static FileStream Open(string path, FileMode mode)
// 範例:附加模式開啟並寫入
FileStream fs = File.Open(@"c:\tempuploads\newFile.txt", FileMode.Append);
byte[] info = { (byte)'h', (byte)'e', (byte)'l', (byte)'l', (byte)'o' };
fs.Write(info, 0, info.Length);
fs.Close();
public static FileStream Create(string path)
// 範例:建立檔案並立即關閉
FileStream fs = File.Create(@"c:\tempuploads\newFile.txt");
fs.Close(); // 必須關閉才能被其他程式存取
public static void Delete(string path)
File.Delete(@"c:\tempuploads\newFile.txt");
public static void Copy(string source, string dest, bool overwrite)
// overwrite=true 允許覆蓋既有檔案
File.Copy(@"c:\tempuploads\newFile.txt", @"c:\tempuploads\BackUp.txt", true);
public static void Move(string source, string dest)
// 僅限同一邏輯磁碟機,跨磁碟需 Copy+Delete
File.Move(@"c:\tempuploads\BackUp.txt", @"c:\BackUp.txt");
public static void SetAttributes(string path, FileAttributes attr)
// 設為唯讀+隱藏
File.SetAttributes(@"c:\tempuploads\newFile.txt",
FileAttributes.ReadOnly | FileAttributes.Hidden);
其他屬性:Archive(存檔)、System(系統)、Temporary(暫存)。
public static bool Exists(string path)
if (File.Exists(@"c:\tempuploads\newFile.txt"))
{
// 存在則複製→刪除→移動
}
else
{
// 不存在則建立→開啟→設定屬性
}
AppendText:附加文字(UTF-8)CreateText:建立/開啟文字檔寫入OpenText:開啟文字檔讀取建議:需支援 Big5/GB2312 等編碼時,改用 StreamReader/StreamWriter 指定 Encoding.Default:
// 讀取
StreamReader sr = new StreamReader(@"c:\test.txt", Encoding.Default);
string content = sr.ReadToEnd();
sr.Close();
// 寫入
StreamWriter sw = new StreamWriter(@"c:\test.txt", false, Encoding.Default);
sw.Write(content);
sw.Close();
public static DirectoryInfo CreateDirectory(string path)
Directory.CreateDirectory(@"c:\tempuploads\NewDirectory");
DirectoryInfo di = new DirectoryInfo(@"c:\tempuploads\NewDirectory");
di.Attributes = FileAttributes.ReadOnly | FileAttributes.Hidden;
public static void Delete(string path, bool recursive)
// recursive=true 刪除非空目錄(含子目錄/檔案)
Directory.Delete(@"c:\tempuploads\BackUp", true);
public static void Move(string source, string dest)
// 原文範例有誤:應用 Directory.Move 而非 File.Move
Directory.Move(@"c:\tempuploads\NewDirectory", @"c:\tempuploads\BackUp");
public static string[] GetDirectories(string path)
string[] dirs = Directory.GetDirectories(@"c:\tempuploads");
public static string[] GetFiles(string path)
string[] files = Directory.GetFiles(@"c:\tempuploads");
public static bool Exists(string path)
if (Directory.Exists(@"c:\tempuploads\NewDirectory"))
{
// 存在:取得子目錄/檔案 → 移動 → 刪除
}
else
{
// 不存在:建立 → 設定屬性
}
| 路徑類型 | 範例 | 說明 |
|---|---|---|
| 相對路徑 | Book | 目前目錄下的 Book |
| 工作目錄相對 | \Tmp\Book | 目前磁碟根目錄下的 Tmp\Book |
| 絕對路徑 | C:\Tmp\Book | 完整路徑 |
C# 中反斜線 \ 為跳脫字元,需寫成 \\ 或使用 @ 逐字字串:@"C:\Tmp\Book"。
FileInfo/DirectoryInfotry-catch 處理 IOException、UnauthorizedAccessExceptionPath.Combine 避免分隔符號問題FileStream 搭配 async/await(.NET Core 以降)EnumerateFiles/EnumerateDirectories 避免記憶體壓力