CodeGym /課程 /C# SELF /建立與刪除目錄 ( Directory)...

建立與刪除目錄 ( Directory)

C# SELF
等級 40, 課堂 1
開放

1. 介紹

想像你在寫一個程式,使用者會上傳他們的照片。把照片全部丟在同一個資料夾通常不太好,最好依日期或使用者名稱建立獨立目錄。或者你的程式產生報表:把結果放到專屬目錄,也需要在執行時建立。工作完成後刪除暫存資料夾是體面的程式行為(也幫使用者清理垃圾)。

處理目錄是很多應用程式的基本任務:從備份到遊戲想把存檔分成不同資料夾。面試中也常問這類問題,因為你不只要知道「建立」或「刪除」,還要懂得這些操作在特殊情況下的行為。

目錄(或資料夾)本質上是檔案系統中用來裝其他檔案與目錄的容器。目錄形成一棵樹狀結構(filesystem tree):每個資料夾都有父目錄(除了根目錄),也可以有很多子目錄。

2. 如何建立資料夾?靜態類別 Directory

最簡單建立資料夾的方法是使用靜態方法 Directory.CreateDirectory。不需要建立任何物件,只要傳入路徑:

using System.IO;

// 建立當前目錄下的 "Reports" 資料夾
Directory.CreateDirectory("Reports");

如果資料夾已經存在,這個方法不會做任何事也不會丟例外 — 可以放心呼叫 CreateDirectory,不用先檢查目錄是否存在。

我們再試更複雜的路徑,例如建立巢狀資料夾:

Directory.CreateDirectory(@"Data\Photos\2024\June");

這個呼叫會建立整個目錄鏈,如果中間有資料夾不存在會一併建立。這就是所謂的遞迴建立 — Directory.CreateDirectory 會自動處理。

重要! 在路徑中使用雙反斜線(\\)在 Windows 上,或使用正斜線(/)。更好的做法是使用我們之前講過的 Path.Combine。

那麼 CreateDirectory 回傳什麼?

該方法會回傳一個 DirectoryInfo 物件。如果你想立即對該目錄做操作,這很方便:

DirectoryInfo reportsDir = Directory.CreateDirectory("Reports");
Console.WriteLine($"已建立資料夾: {reportsDir.FullName}");

如何判斷資料夾是否存在?

在你要對目錄做操作時,通常會想確認它是否存在。可以用靜態方法:

bool exists = Directory.Exists("Reports");
if (!exists)
{
    Console.WriteLine("找不到資料夾,現在建立!");
    Directory.CreateDirectory("Reports");
}

備註:事先檢查並不是必要的:如果資料夾已存在,CreateDirectory 不會出錯。但如果你想顯示訊息給使用者或在邏輯上區分情況,這個方法會有用。

3. 建立目錄:實作案例

把這些知識應用到練習用的應用程式。假設我們要紀錄使用者資料,並為每個使用者保留一個資料夾:

// 在檔案最上方加上 System.IO(如果還沒加的話)
using System.IO;

Console.Write("輸入使用者名稱: ");
string userName = Console.ReadLine() ?? "Unknown";

// 組合使用者資料夾的路徑
string basePath = "UsersData";
string userPath = Path.Combine(basePath, userName);

// 為使用者建立資料夾(如果需要也會建立父目錄)
Directory.CreateDirectory(userPath);

Console.WriteLine($"使用者資料夾 \"{userName}\" 已就緒: {Path.GetFullPath(userPath)}");

上面的例子會建立以下的目錄結構(如果原本不存在):


UsersData/
  └── 使用者名稱/

建議:當你拼接路徑片段時,務必使用 Path.Combine,這樣程式在 Windows、Linux、Mac 都能正常運作。

4. 如何刪除資料夾?方法 Directory.Delete

刪除資料夾幾乎和建立一樣簡單,但有些細節要注意。

Directory.Delete("Reports");

如果資料夾存在且是空的,會被順利刪除。但如果裡面有東西,會拋出例外:
System.IO.IOException: "The directory is not empty."

那要刪除含內容的資料夾怎麼辦?

有一個帶參數的重載可以做到 — 傳入 recursive: true:

Directory.Delete("Reports", recursive: true);

注意:遞迴刪除會不可逆地清除資料夾內的所有東西。如果指定錯誤的目錄,可能會遺失重要資料。操作前務必再三確認路徑!

範例

我們加上刪除使用者資料夾的功能(例如使用者刪除帳號時):

// 詢問是否要刪除
Console.Write("刪除使用者資料夾? (y/n): ");
string input = Console.ReadLine() ?? "";

if (input.ToLower() == "y")
{
    if (Directory.Exists(userPath))
    {
        // 連同所有內容一起刪除
        Directory.Delete(userPath, recursive: true);
        Console.WriteLine("使用者資料夾已刪除!");
    }
    else
    {
        Console.WriteLine("資料夾已不存在。");
    }
}

5. 表格:主要的資料夾操作方法

操作 方法 特性
建立資料夾
Directory.CreateDirectory(path)
遞迴建立路徑上所有資料夾
檢查是否存在
Directory.Exists(path)
回傳 true 或 false
刪除空資料夾
Directory.Delete(path)
若資料夾非空會拋出例外
刪除含內容的資料夾
Directory.Delete(path, recursive: true)
不可逆地清除內部所有內容
取得檔案列表
Directory.GetFiles(path)
回傳檔案名稱清單
取得子資料夾列表
Directory.GetDirectories(path)
回傳資料夾名稱清單

6. 不明顯的要點與常見錯誤

建立時發生錯誤:沒有權限或路徑不正確

如果你嘗試在系統目錄建立資料夾(例如 "C:\Windows\System32\SuperApp"),很可能會遇到 UnauthorizedAccessException 或 IOException。

實用建議:

若對外部目錄(像是使用者的隨身碟或網路磁碟)操作,務必用 try-catch 處理例外。

不要直接信任使用者輸入的路徑。

try
{
    Directory.CreateDirectory(pathFromUser);
}
catch (Exception ex)
{
    Console.WriteLine($"無法建立資料夾: {ex.Message}");
}

刪除時資料夾被其他程序使用

如果有人(或你的程式)打開了資料夾內的檔案並保持開啟,嘗試刪除該資料夾時會收到 IOException — 「無法刪除,資料夾正在使用中」。先關閉資料夾內的所有檔案。

資料夾非空但你忘了 recursive: true

這是很常見的問題。如果沒有傳入 recursive: true,而且資料夾不是空的,會拋出例外。

對於重要操作使用絕對路徑

相對路徑("Reports")是相對於應用程式的當前工作目錄。如果程式從不同位置啟動,資料夾會建立在你意想不到的地方。檢查程式的啟動位置,或直接使用完整路徑:

string fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyAppData");
Directory.CreateDirectory(fullPath);
2
任務
C# SELF, 等級 40, 課堂 1
上鎖
建立自訂目錄結構
建立自訂目錄結構
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION