Как использовать OpenFileDialog для выбора папки?

Как использовать OpenFileDialog для выбора папок?

Я собирался использовать следующий проект: https://github.com/scottwis/OpenFileOrFolderDialog

Однако я столкнулся с одной проблемой. Он использует функцию GetOpenFileName и структуру OPENFILENAME. И OPENFILENAME имеет член с именем templateID. Это идентификатор шаблона диалога. И проект содержит файл res1.rc и шаблонный диалог init. Но я не мог понять, как прикрепить этот файл к моему проекту С#.

Есть ли лучший способ использовать OpenFileDialog для выбора папок?

Ответ 1

В принципе вам нужен класс 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 class

Ответ 2

В качестве заметки для будущих пользователей, которые хотели бы избежать использования FolderBrowserDialog, Microsoft использовала выпуск API под названием WindowsAPICodePack, который содержал полезный диалог с именем CommonOpenFileDialog, который можно было установить в режим IsFolderPicker.

Если у вас есть доступ к пакетам nuget, он по-прежнему доступен в WindowsAPICodePack списках как WindowsAPICodePack

Для строки включения:

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

ВНИМАНИЕ: официальный пакет Microsoft Nuget доступен уже сейчас

  • Microsoft.WindowsAPICodePack-Core
  • Microsoft.WindowsAPICodePack-Shell

каждый пакет от Microsoft и будет устанавливать оба.
URL проекта: http://code.msdn.microsoft.com/WindowsAPICodePack.

Пользователь NuGet aybe загрузил серию неофициальных пакетов. Большинство людей, кажется, доверяют ему как надежному источнику.

Это все, что мне нужно было установить, чтобы использовать CommonOpenFileDialog. (nuget обработал зависимости)

Install-Package WindowsAPICodePack-Shell

Ответ 3

Странно, что столько ответов/голосов, но никто не добавляет следующий код в качестве ответа:

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

Ответ 4

Существует хакерское решение, использующее OpenFileDialog где ValidateNames и CheckFileExists оба имеют значение false, а FileName задается фиктивное значение, чтобы указать, что каталог выбран.

Я говорю хак, потому что это сбивает с толку пользователей о том, как выбрать папку. Они должны быть в нужной папке, а затем просто нажать кнопку "Открыть", а имя файла говорит "Выбор папки".

C# Folder selection dialog

Это основано на Выбрать файл или папку из того же диалога Дениса Станковского.

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

Ответ 5

Звучит так, как будто вы сразу после FolderBrowserDialog.

Ответ 7

Вот еще одно решение, в котором весь источник доступен в одном простом ZIP файле.

Он представляет OpenFileDialog с дополнительными флагами Windows, что делает его похожим на диалог выбора папки Windows 7+.

Для веб-сайта это общественное достояние: "Там нет лицензии как таковой, так как вы не можете брать и делать с кодом то, что вы будете".

Ссылки на Archive.org:

Ответ 8

Я посмотрел на WindowsAPICodePack CommonOpenFileDialog, упомянутый выше. Это именно тот ответ, который я искал. Я всегда думал, что FolderBrowserDialog был ужасным инструментом.

Ответ 9

это должен быть самый очевидный и прямой путь

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

}