在 C# 中,System.IO 命名空間提供了豐富的類別來處理目錄與檔案操作。Directory 與 DirectoryInfo 是兩個核心類別,前者提供靜態方法,後者提供實例化操作,兩者各有優勢。
// 取得所有邏輯磁碟機 (例如 C:\, D:\)
string[] drives = Directory.GetLogicalDrives();
// 取得應用程式目前的工作目錄
string currentPath = Directory.GetCurrentDirectory();
// 從路徑中取得檔案名稱
string fileName = Path.GetFileName(@"c:\dir\file.txt"); // 結果: file.txt
// 取得指定目錄下的所有檔案
string[] files = Directory.GetFiles(path);
// 建立 DirectoryInfo 實例
DirectoryInfo di = new DirectoryInfo(@"f:\MyDir");
// 建立目錄 (若不存在)
DirectoryInfo newDir = Directory.CreateDirectory(@"f:\bbs");
// 檢查目錄是否存在並建立
if (!di.Exists) {
di.Create();
}
// 建立子目錄
DirectoryInfo subDir = di.CreateSubdirectory("SubDir");
// 刪除目錄 (true 表示遞刪子目錄與檔案)
subDir.Delete(true);
di.Delete(true);
// 刪除目錄及其所有內容
Directory.Delete(@"f:\bbs2", true);
// 取得符合模式的子目錄 (例如以 b 開頭)
string[] dirs = Directory.GetDirectories(@"f:\", "b*");
Console.WriteLine($"此目錄中以 b 開頭的子目錄共 {dirs.Length} 個!");
foreach (string dir in dirs) {
Console.WriteLine(dir);
}
// 取得目錄下所有檔案與子目錄名稱
string[] entries = Directory.GetFileSystemEntries(path);
// 取得父目錄路徑
DirectoryInfo parent = Directory.GetParent(path);
Console.WriteLine(parent.FullName);
// 移動目錄 (含內容)
Directory.Move(@"f:\bbs\1", @"f:\bbs\2");
File 與 FileInfo 提供檔案層級的建立、讀寫、複製、移動、刪除等操作。
using System;
using System.IO;
class TextFileDemo {
static string path = @"f:\t.txt";
public static void Main() {
// 建立並寫入 (覆蓋模式)
if (!File.Exists(path)) {
using (StreamWriter sw = File.CreateText(path)) {
sw.WriteLine("Hello");
}
}
// 讀取檔案
using (StreamReader sr = File.OpenText(path)) {
string line;
while ((line = sr.ReadLine()) != null) {
Console.WriteLine(line);
}
}
// 刪除與複製
try {
File.Delete(path);
File.Copy(path, @"f:\tt.txt");
} catch (Exception ex) {
Console.WriteLine($"操作失敗: {ex.Message}");
}
}
}
private const string fileName = "Test.data";
public static void BinaryFileDemo() {
// 建立檔案流並寫入位元組
using (FileStream fs = new FileStream(fileName, FileMode.CreateNew)) {
byte[] data = new UTF8Encoding(true).GetBytes("This is some text in the file.");
fs.Write(data, 0, data.Length);
}
// 讀取二進位資料
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) {
using (BinaryReader br = new BinaryReader(fs)) {
for (int i = 0; i < 11; i++) {
Console.WriteLine(br.ReadInt32());
}
}
}
}
| 類別 | 用途 |
|---|---|
Stream | 位元組讀寫基底類別,支援同步/非同步、定位 |
FileStream | 檔案隨機存取,預設同步 |
MemoryStream | 記憶體緩衝區串流,無實體檔案 |
BufferedStream | 為其他串流 (如網路串流) 加入緩衝 |
NetworkStream | 網路通訊串流 |
StreamReader/StreamWriter | 文字編碼讀寫 (支援 UTF-8、Big5 等) |
BinaryReader/BinaryWriter | 基本型別 (int、float、string 等) 的二進位讀寫 |
StringReader/StringWriter | 字串作為串流來源/目的地 |
TextReader/TextWriter | 文字讀寫抽象基類 |
// 取得系統預設編碼
Encoding defaultEnc = Encoding.Default;
// 字串轉位元組陣列 (預設編碼)
byte[] bytes = defaultEnc.GetBytes("中國人民解放軍");
// 位元組陣列轉 UTF-8 字串
string utf8Str = Encoding.GetEncoding("UTF-8").GetString(bytes);
using (StreamWriter sw = File.AppendText(Server.MapPath(".") + @"\myText.txt")) {
sw.WriteLine("追逐理想");
sw.WriteLine("kzlll");
sw.WriteLine(".Net筆記");
sw.Flush();
}
string src = Server.MapPath(@".\myText.txt");
string dest = Server.MapPath(@".\myTextCopy.txt");
File.Copy(src, dest, true); // 複製並覆蓋
File.Move(src, dest); // 移動 (剪貼)
File.Delete(dest); // 刪除
// 建立 c:\sixAge\sixAge1\sixAge1_1
DirectoryInfo root = Directory.CreateDirectory(@"c:\sixAge");
DirectoryInfo sub1 = root.CreateSubdirectory("sixAge1");
DirectoryInfo sub2 = sub1.CreateSubdirectory("sixAge1_1");
// 設定目前目錄並建立相對路徑
Directory.SetCurrentDirectory(@"c:\sixAge");
Directory.CreateDirectory("sixAge2");
Directory.CreateDirectory(@"sixAge2\sixAge2_1");