如何使用OpenFileDialog选择文件夹?


296

如何使用 OpenFileDialog选择文件夹?

我打算使用以下项目:https : //github.com/scottwis/OpenFileOrFolderDialog

但是,我遇到了一个问题。它使用GetOpenFileName功能和OPENFILENAME结构。并将OPENFILENAME成员命名为templateID。它是对话框模板的标识符。项目还包含res1.rc文件和模板化对话框init。但是我不知道如何将此文件附加到我的C#项目中。

有没有更好的方法来使用OpenFileDialog选择文件夹?


如果使用编辑器打开项目文件,则会在底部注意到一些其他属性:<VCIncludePath ...>,<Win32Resource ...>和<Target Name =“ BeforeBuild” ...>。您将看到它运行rc.exe来编译资源文件res1.rc(确保也将“ resource.h”也复制到您的项目中)。确保已安装VisualC,并且VCIncludePath指向正确的位置(github的一个指向VC9.0版本,可能需要更改它)。编译.rc文件后,将使用Win32Resource指令将生成的.res文件添加为可执行文件的资源。
mistika 2014年

3
有一个使用OpenFileDialog的恶意解决方案,其中ValidateNamesCheckFileExists都设置为false,FileName并提供了一个模拟值来指示已选择目录。我之所以说hack,是因为它使用户对如何选择文件夹感到困惑。请参阅从同一对话框中选择文件或文件夹
Daniel Ballinger 2015年

1
感谢Dan指向OpenFileDialog-Hack!这比FolderFrowserDialog更好,因为OFD会显示带有书签的文件夹等,因此每个人(尤其是大公司)都会发现自己的废话。在那些地方,FBD不会做得很好。
JayC667 '16

1
@ComradeJoecool我已将我的评论转换为答案。我尝试了几次,没有出现“找不到文件”的问题。您是否在重复使用相同的OpenFileDialog实例?
丹尼尔·巴林格

1
@DanielBallinger啊,我发现我的问题,因为我使用PowerShell创建的对话框中,设置ValidateNamesCheckFileExistsfalse没有工作,我需要将它们设置为0(或学习PowerShell的更好)
ComradeJoecool

Answers:


397

基本上你需要 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.IODirectory


184
FolderBrowserDialog缺乏可用性。主要缺点是,它不允许您从Windows资源管理器复制文件夹路径以进行快速导航,从而在需要向下钻取三个以上级别时无用。不需要钻入每个文件夹,尤其是在存储速度较慢或其中一个级别有很多文件夹时。
mistika 2014年

2
该问题专门用于使用OpenFileDialog(OFD)选择文件夹,而不是FolderFrowserDialog(FBD)。我同意从用户的角度来看FBD太糟糕了。
Michael Paulukonis 2015年

25
作为对此对话框,打破UI,使用CommonOpenFileDialognew CommonOpenFileDialog { IsFolderPicker = true }
ANeves 2015年

113
不要使用它!我记得作为一个用户,我曾指责这些可怜的程序员使用这个可怕的树视图对话框 (这只是FolderBrowserDialog)制作了另一个应用程序。这是完全不可用的:一堆根目录,一个缺少的“收藏夹”面板以及最可怕的-您甚至无法在其中粘贴路径!现在作为程序员,我看到了使用它的建议……请不要这样做。
Hi-Angel

2
FolderBrowserDialog除了其他用户所说的所有其他功能之外,还有一个大缺陷。它不记得最后选择的路径!
AleX_

252

作为对将来希望避免使用的用户的说明FolderBrowserDialog,Microsoft曾经发布了一个名为WindowsAPICodePack的API,该API具有一个名为的有用对话框CommonOpenFileDialog,可以将其设置为一种IsFolderPicker模式。Microsoft可以通过NuGet程序包获得该API 。

这是我安装和使用所需的全部CommonOpenFileDialog。(NuGet处理了依赖项)

Install-Package Microsoft.WindowsAPICodePack-Shell

对于包含行:

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);
}

35
我认为这是“如何使用OpenFileDialog选择文件夹?”的最接近答案。FolderBrowseDialog非常不可用。感谢您的回答。
Koray

46
这应该是答案。请注意,您需要先Microsoft.WindowsAPICodePack.Shell通过NuGet 安装软件包,然后才能使用它CommonOpenFileDialog
smwikipedia '17

1
如果将其与VS2017一起使用,它将重新设置主窗口的样式。
Lokiare

1
FolderBrowserDialog用户注意:同时使用多个实例可能会造成问题。这样CommonOpenFileDialog比较好
Alper

9
微软似乎将其重新发布为WindowsAPICodePack-Shell
NucS '19

32

有一个骇人的解决方案,使用OpenFileDialogwhere ValidateNamesCheckFileExists都设置为false和FileName提供了一个模拟值来指示已选择目录。

我之所以说hack,是因为它使用户对如何选择文件夹感到困惑。它们需要位于所需的文件夹中,然后在文件名显示“文件夹选择”时按“打开”。

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);
    // ...
}

我知道,是的,我已经开始运作了。一件令人讨厌的事情是,Folder Selection.它将像这样添加到文件名的末尾:C:\Folder Selection.我想您总是可以从字符串中删除那些字符。看起来还是比FolderBrowserDialog更好
-Joecool同志

这对我不起作用。它不允许我选择文件夹。它只是打开它们。
Lokiare

1
@Lokiare这就是我说的是骇客的意思。请参阅第二段中的说明。
丹尼尔·巴林格

2
@ComradeJoecool您不必手动将其删除。多数民众赞成在代码的最后一行是:字符串folderPath = Path.GetDirectoryName(folderBrowser.FileName);
Heriberto Lugo

哦! 此方法存在问题:如果用户在浏览文件夹时按下向上向后按钮Open,则对话框的主按钮将无法正常工作!它会导致您跳回到上一个文件夹!但是当您双击文件夹以选择它们或在每个文件夹中选择一些文件(如果可以选择任何文件)时
起作用

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
是否有你的答案之间并@尼卡比曹任何区别回答
Chetan Mehra

1
逻辑是一样的,但是我的答案要短得多,并且您无需为DialogResult创建额外的变量。
安德鲁

2
如前所述,这种方法存在一些大问题:这是一个糟糕的树视图对话框!您无法复制粘贴路径,必须从根文件夹中一步一步钻取,并且没有“收藏夹”面板!
S.Serpooshan

@ S.Serpooshan没关系。这只是使用ANY对话框的一个示例。您可以根据需要使用任何其他对话框。:)
Andrew

9

在我看来,您就在FolderBrowserDialog之后


5
我猜想这正在被b / c贬低(正如mistika指出的那样),FolderBrowserDialog具有可怕的可用性,OP明确希望使用OpenFileDialog。
mbx

3
@mbx也许。公平地说,OP不会说“除了OpenFileDialog,我什么也不能使用”。当我最初回答此问题时(超过4年半……),当时的假设是OP根本不知道如何让用户打开文件夹。发布此答案后,我实际上并没有回到这个问题,所以我没有看到关于可用性的任何讨论-回答时也没有考虑它。
西蒙·怀特黑德

6

这是另一种解决方案,它在一个简单的ZIP文件中提供了所有源。

它为OpenFileDialog提供了其他Windows标志,使其像Windows 7+ Folder Selection对话框一样工作。

在该网站上,它是公共领域:“没有许可证,您可以随意使用和使用代码。”

Archive.org链接:


1
完美地工作!也可以通过在“ FolderSelectDialog.cs”中添加以下行来使其选择多个文件夹:public string [] FileNames {get {return ofd.FileNames; 并更改ofd.Multiselect = true; 在构造函数中
Maxter

5

看一下Ookii Dialogs库,它具有分别针对Windows Forms和WPF的文件夹浏览器对话框的实现。

在此处输入图片说明

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.