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

C# 檔案下載儲存路徑選擇:FolderBrowserDialog 與 FolderNameEditor 完整實作

     編輯:關於C語言

需求:讓使用者以圖形介面選擇資料夾作為下載儲存目錄

WinForms 內建 FolderBrowserDialog 簡單易用;若需更客製化(如自訂描述、起始位置、限制子資料夾),可使用 FolderNameEditor 封裝的 FolderBrowser。本文提供兩種方案完整代碼與最佳實踐。

方案一:標準 FolderBrowserDialog(推薦,.NET 所有版本支援)

基本用法


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 / 5+ 新增屬性


// .NET Core 3.1+ / .NET 5+ 新增
dialog.UseDescriptionForTitle = true;   // 標題列顯示 Description 而非預設標題
dialog.InitialDirectory = @"D:\Downloads"; // 直接指定初始目錄(優先於 RootFolder)
// dialog.AutoUpgradeEnabled = true;   // 自動使用 Vista 風格對話框(預設 true)

方案二:FolderNameEditor 封裝 FolderBrowser(進階客製化)

適用於需繼承自訂對話框行為、整合至設計時編輯器、或需更精細控制 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;
}

兩種方案對比

特性FolderBrowserDialogFolderNameEditor + FolderBrowser
命名空間System.Windows.FormsSystem.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);

現代化替代:WPF / WinUI 3 / MAUI

  • WPF:Microsoft.Win32.OpenFolderDialog (.NET 5+) 或 CommonOpenFileDialog (Windows API Code Pack)。
  • WinUI 3 / MAUI:FolderPicker (Windows.Storage.Pickers),支援 UWP 沙盒模型。
  • 跨平台:FilePicker (MAUI.Essentials) 於行動平台選擇資料夾受限,通常改選檔案或使用平台原生 API。

避坑指南

  1. System.Design.dll 部署:使用 FolderNameEditor 專案需加入 System.Design 參考,ClickOnce/安裝專案需確保目標機器有 .NET Framework 完整安裝(Client Profile 不含)。
  2. 初始路徑不生效:FolderBrowserDialog.InitialDirectory 僅在 AutoUpgradeEnabled=true (Vista 風格) 時生效;舊版 XP 風格需設定 SelectedPath。
  3. 權限不足:使用者選擇的資料夾寫入需具備權限,建議下載前以 Directory.GetAccessControl 或試寫入暫存檔驗證。
  4. 長路徑支援:Windows 10 1607+ 需啟用「啟用 Win32 長路徑」群組原則或應用程式清單 longPathAware,否則 >260 字元路徑會失敗。

總結

一般 WinForms 應用首選 FolderBrowserDialog,零相依、API 直觀、.NET 5+ 持續更新;元件庫開發或需精細樣式控制時,FolderNameEditor + FolderBrowser 提供更大彈性。配合「記住上次路徑」、「權限預檢」、「長路徑支援」三大實務技巧,打造專業級的資料夾選擇體驗。

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