[C#][Windows Formsアプリ][FolderBrowserDialog] SelectedPath を使いこなす—初期フォルダ指定から保存処理まで

スポンサーリンク

はじめに

この記事では、Windows Forms の FolderBrowserDialog における中核プロパティ SelectedPath の使い方を解説します。SelectedPath は「ユーザーが最後に選んだフォルダの絶対パス」であり、初期表示のフォルダ指定にも使えます。基本の使い方、初期フォルダのセット、キャンセル時の取り扱い、保存処理への応用まで、初心者にもわかりやすく説明します。

説明

SelectedPath とは?
FolderBrowserDialog でフォルダ選択ダイアログを開いた後、ユーザーが「OK」を押して確定したフォルダのフルパスが入ります。ダイアログ表示前に値をセットしておけば「初期選択フォルダ」としても機能します(存在するフォルダを推奨)。

基本の流れ
1) SelectedPath に初期フォルダ(任意)を設定
2) ShowDialog() を呼び出し、結果が DialogResult.OK なら SelectedPath を読む
3) 取得したパスをアプリの処理(保存先など)に利用

初期フォルダの考え方
ユーザーがよく使う場所(ドキュメント・デスクトップ等)を Environment.GetFolderPath で取得し、SelectedPath に入れておくと迷いにくくなります。過去に選ばれたフォルダを覚えておき、次回の初期値にするのも親切です。

キャンセル時の扱い
ユーザーがキャンセルした場合、SelectedPath を使った処理は行わずに終了します。前回値を保持している場合は、上書きしない(=そのまま残す)運用がわかりやすいです。

サンプルコード

テキストを入力し、「フォルダを選択…」で FolderBrowserDialog を開いてフォルダを選び、「そのフォルダへ保存」で SelectedPath 配下に memo.txt を保存する最小アプリです。初期選択フォルダには「ドキュメント」を使用しています。

using System; using System.IO; 
using System.Text; 
using System.Windows.Forms;

public class MainForm : Form
{
private readonly TextBox _txt = new TextBox();
private readonly TextBox _txtFolder = new TextBox();
private readonly Button _btnBrowse = new Button();
private readonly Button _btnSave = new Button();

// ユーザーが最後に選んだフォルダを保持(初期値はドキュメント)
private string _selectedFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

public MainForm()
{
    Text = "FolderBrowserDialog: SelectedPath デモ";
    Width = 720;
    Height = 480;

    _txt.Multiline = true;
    _txt.ScrollBars = ScrollBars.Both;
    _txt.Dock = DockStyle.Fill;

    _txtFolder.ReadOnly = true;
    _txtFolder.Width = 420;
    _txtFolder.Text = _selectedFolder;

    _btnBrowse.Text = "フォルダを選択...";
    _btnBrowse.AutoSize = true;
    _btnBrowse.Click += OnBrowseClick;

    _btnSave.Text = "そのフォルダへ保存";
    _btnSave.AutoSize = true;
    _btnSave.Click += OnSaveClick;

    var top = new FlowLayoutPanel
    {
        Dock = DockStyle.Top,
        Height = 72,
        Padding = new Padding(8),
        FlowDirection = FlowDirection.LeftToRight,
        WrapContents = false
    };
    top.Controls.Add(new Label { Text = "保存先フォルダ:", AutoSize = true, Padding = new Padding(0, 6, 8, 0) });
    top.Controls.Add(_txtFolder);
    top.Controls.Add(_btnBrowse);
    top.Controls.Add(_btnSave);

    Controls.Add(_txt);
    Controls.Add(top);
}

private void OnBrowseClick(object? sender, EventArgs e)
{
    using (var fbd = new FolderBrowserDialog())
    {
        // ダイアログ上部の説明文
        fbd.Description = "保存先のフォルダを選択してください。";

        // 初期選択フォルダ(存在するパスを推奨)
        fbd.SelectedPath = Directory.Exists(_selectedFolder)
            ? _selectedFolder
            : Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

        // 新しいフォルダ作成ボタンを表示(必要に応じて)
        fbd.ShowNewFolderButton = true;

        var dr = fbd.ShowDialog(this);
        if (dr == DialogResult.OK)
        {
            // ユーザーが確定した絶対パス
            _selectedFolder = fbd.SelectedPath;
            _txtFolder.Text = _selectedFolder;
        }
        // Cancel の場合は何もしない(前回の値を維持)
    }
}

private void OnSaveClick(object? sender, EventArgs e)
{
    // 保存先が無ければ安全な場所にフォールバック
    var baseDir = Directory.Exists(_selectedFolder)
        ? _selectedFolder
        : Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

    var path = Path.Combine(baseDir, "memo.txt");

    try
    {
        // UTF-8 (BOMなし) で保存
        File.WriteAllText(path, _txt.Text, new UTF8Encoding(false));

        MessageBox.Show(
            "保存しました:\n" + path,
            "保存完了",
            MessageBoxButtons.OK,
            MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        MessageBox.Show(
            "保存に失敗しました。\n" + ex.Message,
            "エラー",
            MessageBoxButtons.OK,
            MessageBoxIcon.Error);
    }
}


}
実行例

実行例

実行例

実行例

実行例

実行例

— サンプルコードの解説 —

① 初期値の設定: フォームのフィールド _selectedFolder に「ドキュメント」を入れておき、FolderBrowserDialog.SelectedPath に渡しています。存在しないパスを初期値にすると期待どおりフォーカスされないことがあるため、Directory.Exists での確認が安心です。

② 決定後の取り扱い: ShowDialog()DialogResult.OK のときだけ fbd.SelectedPath を自前フィールドへ反映し、テキストボックスにも表示しています。キャンセル時は前回値を維持します。

③ 保存の流れ: 取得したフォルダとファイル名を Path.Combine で連結し、File.WriteAllText で保存しています。フォルダが削除されていた等のケースを考慮して、最終的な保存時も try-catch で例外を捕捉しています。

④ ユーザー体験の工夫: ShowNewFolderButtontrue にすると、ダイアログから新規フォルダを作成できます。説明文は Description に短く明確に。

つまづきポイント

存在しないフォルダを初期値にする: SelectedPath に存在しないパスを渡すと、意図した場所が選択されないことがあります。必ず Directory.Exists で確認しましょう。

相対パスの使用: SelectedPath は絶対パスを前提に運用してください。相対パスにすると現在の作業ディレクトリに依存して混乱のもとです。

キャンセル時の空文字: キャンセルされたときに SelectedPath を信用して処理を進めるとエラーの原因になります。必ず ShowDialog() の結果で分岐しましょう。

権限不足・ネットワーク: 選択先がネットワークドライブやアクセス制限フォルダの場合、保存で失敗することがあります。例外処理とユーザー向けのエラーメッセージを用意しておきましょう。

まとめ

SelectedPath は「選ばれたフォルダの絶対パス」であり、初期選択にも使える重要プロパティです。ShowDialog() の結果を確認しつつ、存在チェックと例外処理を添えるだけで、実務でも安心して使えるフォルダ選択フローが構築できます。

Please follow and like us:

コメント

タイトルとURLをコピーしました