首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# System.IO 實戰速查:檔案與目錄操作 13 大核心場景完整指南

     編輯:關於C語言

命名空間與核心類別

using System.IO;
// 核心類別:
// File      - 靜態檔案操作
// FileInfo  - 實例檔案操作(可重複使用、提供屬性)
// Directory - 靜態目錄操作
// DirectoryInfo - 實例目錄操作
// Path      - 路徑字串處理(跨平台安全)

13 大高頻操作場景

1. 相對路徑轉絕對路徑


// ASP.NET Core / .NET 6+
string absolute = Path.GetFullPath(relativePath); // 跨平台

// 舊版 ASP.NET (System.Web)
string absolute = HttpContext.Current.Server.MapPath("~/App_Data/file.txt");

2. 檔案移動/重命名


File.Move(sourcePath, destPath, overwrite: true); // .NET Core 3.0+ 支援覆寫
// 或
new FileInfo(sourcePath).MoveTo(destPath, overwrite: true);

3. 檔案複製


File.Copy(source, dest, overwrite: true);
// 大檔案建議分塊複製或用 FileStream 避免記憶體壓力

4. 檢查檔案是否存在


bool exists = File.Exists(fullPath);
// 注意:回傳 true 不代表可讀寫,仍需 try-catch 處理權限/鎖定

5. 檢查目錄是否存在


bool exists = Directory.Exists(fullPath);

6. 建立目錄(含多層)


Directory.CreateDirectory(fullPath); // 靜態方法:不存在才建立,存在不報錯
// 回傳 DirectoryInfo 可鏈結操作
var di = Directory.CreateDirectory(@"C:\Data\Logs\2024");

7. 目錄移動/重命名


Directory.Move(sourceDir, destDir); // 目標不可存在
// 跨磁碟移動會拋出例外,需改用複製+刪除

8. 讀取文字檔(小檔案)


// 一次性讀完(小檔案)
string content = File.ReadAllText(path, Encoding.UTF8);

// 逐行讀取(記憶體友善)
foreach (string line in File.ReadLines(path, Encoding.UTF8))
{
    Process(line);
}

// 手動控制(需精確編碼/大檔案)
using var sr = new StreamReader(path, Encoding.UTF8);
string all = sr.ReadToEnd();

9. 寫入文字檔


// 覆寫寫入
File.WriteAllText(path, content, Encoding.UTF8);

// 追加寫入
File.AppendAllText(path, newLine + Environment.NewLine, Encoding.UTF8);

// 逐行寫入
File.WriteAllLines(path, lines, Encoding.UTF8);

// 手動控制
using var sw = new StreamWriter(path, append: false, Encoding.UTF8);
sw.WriteLine(line);

10. 刪除檔案(安全模式)


if (File.Exists(path))
{
    try 
    {
        File.Delete(path);
    }
    catch (IOException ex) when (ex.HResult == 0x80070020) // 檔案被鎖定
    {
        // 記錄日誌、稍後重試或通知使用者
    }
}

11. 遞迴遍歷目錄


// 現代寫法:EnumerateFiles 逐步產生,不載入全部陣列
foreach (string file in Directory.EnumerateFiles(root, "*.cs", SearchOption.AllDirectories))
{
    Console.WriteLine(file);
}

// 需要目錄資訊時
foreach (var dir in Directory.EnumerateDirectories(root, "*", SearchOption.AllDirectories))
{
    Console.WriteLine($"目錄:{dir}");
}

// 完整資訊
foreach (var fi in new DirectoryInfo(root).EnumerateFiles("*", SearchOption.AllDirectories))
{
    Console.WriteLine($"{fi.FullName} {fi.Length:N0} bytes {fi.LastWriteTime:yyyy-MM-dd HH:mm}");
}

12. 取得檔案修改時間


DateTime lastWrite = File.GetLastWriteTime(path);      // 本地時間
DateTime lastWriteUtc = File.GetLastWriteTimeUtc(path); // UTC 時間
// 或用 FileInfo 取得更多屬性
var fi = new FileInfo(path);
Console.WriteLine($"建立:{fi.CreationTime} 修改:{fi.LastWriteTime} 存取:{fi.LastAccessTime}");

13. 從完整路徑提取檔名/副檔名/目錄


string full = @"C:\Data\Report\2024_Q1.pdf";

Path.GetFileName(full);        // "2024_Q1.pdf"
Path.GetFileNameWithoutExtension(full); // "2024_Q1"
Path.GetExtension(full);       // ".pdf"
Path.GetDirectoryName(full);   // "C:\Data\Report"
Path.GetFullPath("..\\config.json");    // 解析相對路徑
Path.Combine("C:\\Data", "Logs", "app.log"); // 安全組合路徑

進階主題:大檔案、權限、跨平台

大檔案處理策略

場景建議做法
逐行處理文字File.ReadLines (流式、不載入記憶體)
二進位分塊讀寫FileStream + buffer (64KB~1MB)
複製大檔案File.Copy (OS 層面優化) 或 FileStream.CopyToAsync
隨機存取修改FileStream.Seek + Read/Write
記憶體對映MemoryMappedFile (超大檔、進程間共享)

跨平台路徑處理


// 錯誤:硬編碼分隔符
string bad = "C:\\Data\\file.txt";

// 正確:Path.Combine 自動使用平台分隔符
string good = Path.Combine("C:", "Data", "file.txt"); // Windows: C:\Data\file.txt
                                                     // Linux:   C:/Data/file.txt

// 取得暫存目錄
string temp = Path.GetTempPath(); // Windows: %TEMP%  Linux: /tmp

// 產生唯一暫存檔名
string unique = Path.GetRandomFileName(); // "abc123de.tmp"
string tempFile = Path.Combine(Path.GetTempPath(), unique);

檔案系統監視器


using var watcher = new FileSystemWatcher(@"C:\WatchDir")
{
    Filter = "*.txt",
    NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.Size,
    EnableRaisingEvents = true
};

watcher.Created += (s, e) => Log($"新增:{e.FullPath}");
watcher.Changed += (s, e) => Log($"異動:{e.FullPath} ({e.ChangeType})");
watcher.Deleted += (s, e) => Log($"刪除:{e.FullPath}");
watcher.Renamed += (s, e) => Log($"重命名:{e.OldFullPath} -> {e.FullPath}");

總結:選對類別,事半功倍

需求推薦 API
一次性簡單操作File / Directory 靜態方法
重複操作同一檔案/目錄FileInfo / DirectoryInfo 實例
路徑字串處理Path 靜態方法
大檔案/二進位/隨機存取FileStream
文字編碼控制StreamReader/Writer 指定 Encoding
目錄監控FileSystemWatcher

牢記:永遠用 using 管理資源、指定 Encoding.UTF8、預期例外發生時優雅處理,這才是專業 C# 開發者的檔案操作基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved