WinForms 內建 FolderBrowserDialog 簡單易用;若需更客製化(如自訂描述、起始位置、限制子資料夾),可使用 FolderNameEditor 封裝的 FolderBrowser。本文提供兩種方案完整代碼與最佳實踐。
using System.Windows.Forms;
private void btnChooseFolder_Click(object sender, EventArgs e) {
using (var dialog = new FolderBrowserDialog()) {
dialog.Description = "請選擇下載檔案儲存資料夾";
dialog.ShowNewFolderButton = true; // 允許使用者新建資料夾
dialog.RootFolder = Environment.SpecialFolder.MyComputer; // 從「我的電腦」開始
// dialog.SelectedPath = txtSavePath.Text; // 可設定預設選擇路徑
if (dialog.ShowDialog() == DialogResult.OK) {
txtSavePath.Text = dialog.SelectedPath;
}
}
}
// .NET Core 3.1+ / .NET 5+ 新增
dialog.UseDescriptionForTitle = true; // 標題列顯示 Description 而非預設標題
dialog.InitialDirectory = @"D:\Downloads"; // 直接指定初始目錄(優先於 RootFolder)
// dialog.AutoUpgradeEnabled = true; // 自動使用 Vista 風格對話框(預設 true)
適用於需繼承自訂對話框行為、整合至設計時編輯器、或需更精細控制 FolderBrowserStyles 的場景。
using System.Windows.Forms.Design; // 需引用 System.Design.dll
using System.Windows.Forms;
public class FolderSelector : FolderNameEditor {
private FolderBrowser _browser = new FolderBrowser();
private string _description = "請選擇資料夾";
private string _selectedPath = string.Empty;
public string Description {
get => _description;
set => _description = value;
}
public string SelectedPath => _selectedPath;
public DialogResult ShowDialog() {
_browser.Description = _description;
_browser.StartLocation = FolderBrowserFolder.MyComputer;
// 可組合樣式:RestrictToSubfolders | RestrictToDomain | ShowTextBox
_browser.Style = FolderBrowserStyles.RestrictToSubfolders;
DialogResult result = _browser.ShowDialog();
if (result == DialogResult.OK)
_selectedPath = _browser.DirectoryPath;
else
_selectedPath = string.Empty;
return result;
}
// 靜態便利方法
public static string BrowseForFolder(string description = "請選擇資料夾", string initialPath = "") {
using (var selector = new FolderSelector { Description = description }) {
if (!string.IsNullOrEmpty(initialPath))
selector._browser.DirectoryPath = initialPath; // 設定初始路徑(需在 ShowDialog 前)
return selector.ShowDialog() == DialogResult.OK ? selector.SelectedPath : string.Empty;
}
}
}
private void btnChooseFolderAdvanced_Click(object sender, EventArgs e) {
string path = FolderSelector.BrowseForFolder(
description: "選擇專案輸出目錄",
initialPath: txtSavePath.Text
);
if (!string.IsNullOrEmpty(path))
txtSavePath.Text = path;
}
| 特性 | FolderBrowserDialog | FolderNameEditor + FolderBrowser |
|---|---|---|
| 命名空間 | System.Windows.Forms | System.Windows.Forms.Design (需 System.Design.dll) |
| 部署相依性 | 無額外 DLL | 需部署 System.Design.dll |
| 自訂樣式 | 有限 (Description, RootFolder, ShowNewFolderButton) | 豐富 (FolderBrowserStyles 組合、StartLocation 微調) |
| 設計時整合 | 無 | 可作為 PropertyGrid 編輯器 ([Editor(typeof(FolderNameEditor), typeof(UITypeEditor))]) |
| 跨平台 | 僅 Windows | 僅 Windows |
| 建議場景 | 一般應用程式資料夾選擇 | 元件開發、設計時編輯器、需精細樣式控制 |
private const string LastPathKey = "LastDownloadFolder";
private void LoadLastFolder() {
string last = Properties.Settings.Default[LastPathKey] as string;
if (!string.IsNullOrEmpty(last) && Directory.Exists(last))
txtSavePath.Text = last;
}
private void SaveLastFolder(string path) {
Properties.Settings.Default[LastPathKey] = path;
Properties.Settings.Default.Save();
}
// 在選擇成功後呼叫 SaveLastFolder(dialog.SelectedPath);
Microsoft.Win32.OpenFolderDialog (.NET 5+) 或 CommonOpenFileDialog (Windows API Code Pack)。FolderPicker (Windows.Storage.Pickers),支援 UWP 沙盒模型。FilePicker (MAUI.Essentials) 於行動平台選擇資料夾受限,通常改選檔案或使用平台原生 API。FolderNameEditor 專案需加入 System.Design 參考,ClickOnce/安裝專案需確保目標機器有 .NET Framework 完整安裝(Client Profile 不含)。FolderBrowserDialog.InitialDirectory 僅在 AutoUpgradeEnabled=true (Vista 風格) 時生效;舊版 XP 風格需設定 SelectedPath。Directory.GetAccessControl 或試寫入暫存檔驗證。longPathAware,否則 >260 字元路徑會失敗。一般 WinForms 應用首選 FolderBrowserDialog,零相依、API 直觀、.NET 5+ 持續更新;元件庫開發或需精細樣式控制時,FolderNameEditor + FolderBrowser 提供更大彈性。配合「記住上次路徑」、「權限預檢」、「長路徑支援」三大實務技巧,打造專業級的資料夾選擇體驗。