OpenFileDialogを使用してフォルダーを選択する方法


296

を使用OpenFileDialogしてフォルダーを選択するには?

次のプロジェクトを使用する予定でした:https : //github.com/scottwis/OpenFileOrFolderDialog

しかし、私は一つの問題に直面しました。GetOpenFileName関数とOPENFILENAME構造を使用します。またOPENFILENAME、というメンバーがいtemplateIDます。ダイアログテンプレートの識別子です。また、プロジェクトにはres1.rcファイルとテンプレートダイアログinitも含まれています。しかし、このファイルをC#プロジェクトに添付する方法を理解できませんでした。

を使用しOpenFileDialogてフォルダを選択するより良い方法はありますか?


エディターでプロジェクトファイルを開くと、下部にいくつかの追加のプロパティが表示されます:<VCIncludePath ...>、<Win32Resource ...>および<Target Name = "BeforeBuild" ...>。リソースファイルres1.rcをコンパイルするためにrc.exeを実行していることがわかります(「resource.h」もプロジェクトにコピーしてください)。VisualCがインストールされており、VCIncludePathが適切な場所を指していることを確認してください(githubの1つがVC9.0バージョンを指しているため、変更する必要がある場合があります)。.rcファイルをコンパイルした後、結果の.resファイルは、Win32Resourceディレクティブを使用して実行可能ファイルのリソースとして追加されます。
mistika 2014年

3
OpenFileDialogを使用したハックソリューションがValidateNamesありCheckFileExists、両方ともfalseに設定されFileName、ディレクトリが選択されていることを示すモック値が与えられています。フォルダを選択する方法についてユーザーを混乱させるため、ハックと言います。同じダイアログからファイルまたはフォルダ
Daniel Ballinger、2015年

1
OpenFileDialog-Hackを指さしてくれたDanに感謝します!OFDはブックマークされたフォルダなどを表示するので、FolderBrowserDialogよりもはるかに優れています。そのため、特に大企業の誰もががらくたを見つけます。FBDはこれらの場所ではあまり効果がありません。
JayC667

1
@ComradeJoecoolコメントを回答に変換しました。何度か試してみましたが、「ファイルが見つかりません」という問題はありませんでした。同じOpenFileDialogインスタンスを再利用していますか?
ダニエルバリンジャー

1
@DanielBallingerああ、私は問題を発見しました。Powershellを使用してダイアログを作成しているため、設定しValidateNames、機能CheckFileExistsfalseなかったため、それらを設定する必要があります0(またはPowershellをよりよく学ぶ)
ComradeJoecool

回答:


398

基本的にはFolderBrowserDialogクラスが必要です:

ユーザーにフォルダーを選択するように要求します。このクラスは継承できません。

例:

using(var fbd = new FolderBrowserDialog())
{
    DialogResult result = fbd.ShowDialog();

    if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
    {
        string[] files = Directory.GetFiles(fbd.SelectedPath);

        System.Windows.Forms.MessageBox.Show("Files found: " + files.Length.ToString(), "Message");
    }
}

WPFで作業する場合は、への参照を追加する必要がありますSystem.Windows.Forms

あなたはまた、追加する必要がありますusing System.IOためDirectory、クラス


185
FolderBrowserDialogには使いやすさが欠けています。主な欠点は、すばやく移動するためにWindowsエクスプローラーからフォルダーパスをコピーできないため、4つ以上のレベルをドリルダウンする必要があるときに役に立たないことです。特にストレージが遅い場合、またはいずれかのレベルに多数のフォルダがある場合は、各フォルダにドリルダウンすることは望ましくありません。
mistika 2014年

2
問題は、具体的には、OpenFileDialog(OFD)を使用して、FolderBrowserDialog(FBD)ではなくフォルダを選択することです。FBDはユーザーの観点からすればひどいものです。
Michael Paulukonis、2015

26
UIが壊れているこのダイアログの代わりに、CommonOpenFileDialogを使用しますnew CommonOpenFileDialog { IsFolderPicker = true }
ANeves

113
絶対使わないでください!私はユーザーとして、このひどいツリービューダイアログ (単なるFolderBrowserDialog)でさらに別のアプリを作った貧しいプログラマを非難したことを覚えています。それは完全に使用できません:たくさんのルートディレクトリ、欠落したお気に入りパネル、そして最も恐ろしいもの—パスをそこに貼り付けることさえできません!そして今、プログラマーとしてそれを使用するためのアドバイスが表示されます...しないでください。
Hi-Angel

2
FolderBrowserDialogには、他のユーザーが言った他のすべてに加えて、1つの大きな欠陥があります。最後に選択されたパスを記憶していません!
AleX_ 2016年

253

の使用を避けたい将来のユーザーへのメモとしてFolderBrowserDialog、MicrosoftはWindowsAPICodePackと呼ばれるAPIをリリースCommonOpenFileDialogしましたIsFolderPicker。APIはMicrosoftからNuGetパッケージとして入手できます

これは、をインストールして使用するために必要なすべてCommonOpenFileDialogです。(NuGetが依存関係を処理しました)

Install-Package Microsoft.WindowsAPICodePack-Shell

include行の場合:

using Microsoft.WindowsAPICodePack.Dialogs;

使用法:

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
    MessageBox.Show("You selected: " + dialog.FileName);
}

36
これは、「OpenFileDialogを使用してフォルダを選択する方法」に対する最も近い答えだと思います。FolderBrowseDialogは非常に使用できません。この回答をありがとうございます。
Koray 2017年

46
これが答えです。また、Microsoft.WindowsAPICodePack.Shellこれを使用する前に、NuGetを介してパッケージをインストールする必要があることに注意してくださいCommonOpenFileDialog
smwikipedia 2017

1
これをVS2017で使用すると、メインウィンドウのスタイルが変更されます。
Lokiare

1
FolderBrowserDialogユーザーへの注意:複数のインスタンスを同時に使用すると問題が発生する可能性があります。これCommonOpenFileDialogは良いです。
アルパー、

9
Microsoftはそれを次のように再公開しているようですWindowsAPICodePack-Shell
NucS

32

OpenFileDialogwhere ValidateNamesとのCheckFileExists両方をfalseに設定しFileName、ディレクトリが選択されていることを示すモック値が指定されているハックなソリューションがあります。

フォルダを選択する方法についてユーザーを混乱させるため、ハックと言います。ファイル名が「Folder Selection」と表示されている間は、目的のフォルダーにある必要があり、[開く]を押します。

C#フォルダー選択ダイアログ

これは、Denis Stankovskiによる同じダイアログからのファイルまたはフォルダーの選択に基づいています

OpenFileDialog folderBrowser = new OpenFileDialog();
// Set validate names and check file exists to false otherwise windows will
// not let you select "Folder Selection."
folderBrowser.ValidateNames = false;
folderBrowser.CheckFileExists = false;
folderBrowser.CheckPathExists = true;
// Always default to Folder Selection.
folderBrowser.FileName = "Folder Selection.";
if (folderBrowser.ShowDialog() == DialogResult.OK)
{
    string folderPath = Path.GetDirectoryName(folderBrowser.FileName);
    // ...
}

はい、そうです。厄介なことの1つFolder Selection.は、ファイル名の末尾に次のように付けられるC:\Folder Selection.ことです。文字列からこれらの文字をいつでも削除できると思います。それでもFolderBrowserDialogよりも見栄えが良い
ComradeJoecool

これは私にはうまくいきません。フォルダを選択することはできません。開くだけです。
Lokiare

1
@Lokiareそれがハックだと言ったときに私が言ったことです。2番目の段落の説明を参照してください。
Daniel Ballinger、

2
@ComradeJoecool手動で削除する必要はありません。それがコードの最後の行の目的です:string folderPath = Path.GetDirectoryName(folderBrowser.FileName);
Heriberto Lugo

ああ!この方法に問題があります:ユーザーのプレスがあればアップバックのフォルダを参照するときのボタンは、メインのOpen予想通り、ダイアログのボタンが動作しません!前のフォルダに戻ります!しかし、フォルダーをダブルクリックして選択するか、各フォルダー内のいくつかのファイルを選択するだけで機能します(選択できるファイルがある場合)
S.Serpooshan

14

奇妙なほど多くの回答/投票ですが、次のコードを回答として追加する人はいません。

using (var fldrDlg = new FolderBrowserDialog())
{ 
    //fldrDlg.Filter = "Png Files (*.png)|*.png";
    //fldrDlg.Filter = "Excel Files (*.xls, *.xlsx)|*.xls;*.xlsx|CSV Files (*.csv)|*.csv"

    if (fldrDlg.ShowDialog() == DialogResult.OK)
    {
        //fldrDlg.SelectedPath -- your result
    }
}

9
あなたの答えの間とIonicăBizăuの@どんな違いがある回答は
Chetan Mehra

1
ロジックは同じですが、私の答えははるかに短く、DialogResultの追加の変数を作成する必要はありません。
Andrew

2
すでに述べたように、この方法にはいくつかの大きな問題があります。これは恐ろしいツリービューダイアログです!パスをコピーして貼り付けることはできません。ルートフォルダから1つずつドリルダウンする必要があり、お気に入りパネルはありません。
S.Serpooshan

@ S.Serpooshan私は関係ありません。これは、ANYダイアログの使用例にすぎません。必要に応じて、他のダイアログを使用できます。:)
Andrew

9

FolderBrowserDialogの直後のように聞こえます。


5
私はこれがb / cに反対票を投じていると思います(mistikaがすでに指摘したように)FolderBrowserDialogの使いやすさはひどく、OPはOpenFileDialogを明示的に使用したいと考えていました。
mbx

3
@mbxたぶん。公平を期すために、OPは「OpenFileDialogしか使用できない」とは言っていません。私が最初にこれに答えたとき(4年半以上前...)、OPがユーザーにフォルダーを開かせる方法を知らなかったことが前提でした。この回答を投稿した後、私は実際にはこの質問に戻らなかったため、ユーザビリティに関する議論は見ていません。回答する際に考慮もしていません。
Simon Whitehead

6

これは、すべてのソースを単一のシンプルなZIPファイルで利用できる別のソリューションです。

OpenFileDialogに追加のウィンドウフラグを表示し、Windows 7以降のフォルダー選択ダイアログのように機能させます。

ウェブサイトによれば、それはパブリックドメインです:「あなたが自由に取り、あなたが何をするかでコードを実行するようなライセンスはありません。」

Archive.orgリンク:


1
完璧に動作します!。また、「FolderSelectDialog.cs」に次の行を追加することで、複数のフォルダを選択することもできます。public string [] FileNames {get {return ofd.FileNames; }}を変更し、ofd.Multiselect = true;を変更します。コンストラクタ内
Maxter

5

WindowsフォームとWPFのそれぞれにフォルダーブラウザーダイアログを実装したOokii Dialogsライブラリを見てください。

ここに画像の説明を入力してください

Ookii.Dialogs.WinForms

https://github.com/augustoproiete/ookii-dialogs-winforms


Ookii.Dialogs.Wpf

https://github.com/augustoproiete/ookii-dialogs-wpf


良い。注:Ookii.DialogsにはMicrosoft .NET Framework 4.5以降が必要です。(WinXPでは使用できません)
S.Serpooshan

2
@ S.Serpooshan-私のWindows 3.1 PCでも動作しないと思いますよね?しかし、真剣に、2018年には、とにかくWindows XPについて誰も考えるべきではありません-それは長い間死んでいます。
rory.ap

@ rory.ap実際、このソリューションの主な問題は、フォルダーを参照するときにファイルが表示されないことです。ユーザーがフォルダを選択したいときに、ファイル(処理する画像など)を表示できると便利な場合があります。
S.Serpooshan

-5

これは最も明白で簡単な方法です

using (var dialog = new System.Windows.Forms.FolderBrowserDialog())
{

   System.Windows.Forms.DialogResult result = dialog.ShowDialog();

   if(result == System.Windows.Forms.DialogResult.OK)
   {
      selectedFolder = dialog.SelectedPath;
   }

}

3
FolderBrowserDialogすでにここで複数回提供されており、間違った答えです。それは時代遅れでユーザーフレンドリーではないインターフェースです。これはSHBrowseForFolder下で使用され、ドキュメントには「Windows Vista以降IFileDialogFOS_PICKFOLDERS場合は、SHBrowseForFolder関数ではなくオプションを使用することをお勧めします。これは、[フォルダーを選択]モードで[ファイルを開く]ダイアログを使用し、推奨される実装です。」
Herohtar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.