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

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

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

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

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

 JayC66716 сент. 2016 г., 16:19
Спасибо Dan за указание на OpenFileDialog-Hack! Это намного лучше, чем FolderBrowserDialog, потому что OFD показывает папки с закладками и т. Д., Поэтому каждый - особенно в крупных компаниях - находит свое дерьмо. FBD не принесет много пользы в этих местах.
 Daniel Ballinger07 мая 2015 г., 05:28
Существует хакерское решение, использующее OpenFileDialog, гдеValidateNames а такжеCheckFileExists оба установлены в ложь иFileName дается фиктивное значение, чтобы указать, что каталог выбран. Я говорю хак, потому что это сбивает с толку пользователей о том, как выбрать папку. УвидетьSelect file or folder from the same dialog
 Daniel Ballinger10 мая 2018 г., 02:21
@ComradeJoecool Я преобразовал свой комментарий вanswer, Я пробовал это несколько раз, и у меня не было "файла не найдено" вопрос. Вы повторно используете тот же экземпляр OpenFileDialog?
 ComradeJoecool10 мая 2018 г., 02:31
@DanielBallinger ах, я нашел свою проблему, так как я использую Powershell для создания диалога, настройкиValidateNames а такжеCheckFileExists вfalse не работал, мне нужно было установить их0 (или лучше изучите PowerShell)
 mistika24 июн. 2014 г., 17:07
Если вы откроете файл проекта в редакторе, вы увидите некоторые дополнительные свойства внизу: & lt; VCIncludePath ... & gt ;, & lt; Win32Resource ... & gt; и & lt; Target Name = "BeforeBuild" ... & gt ;. Вы увидите, что он запускает rc.exe для компиляции файла ресурсов res1.rc (не забудьте также скопировать файл & quot; resource.h & quot; в свой проект). Убедитесь, что у вас установлен VisualC и что VCIncludePath указывает на правильное местоположение (github 's указывает на версию VC9.0, и вам может потребоваться изменить ее). После компиляции файла .rc полученный файл .res добавляется в качестве ресурса для вашего исполняемого файла с помощью директивы Win32Resource.

Ответы на вопрос(7)

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

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
    }
}
 30 янв. 2018 г., 22:23
Логика та же, но мой ответ намного короче, и вам не нужно создавать дополнительную переменную для DialogResult.
 29 янв. 2018 г., 08:37
Есть ли разница между вашим ответом и @ Ionic & # x103; Biz & # x103; UAnswer?

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

Если у вас есть доступ к пакетам nuget, он все еще доступен в общедоступных списках как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);
}
NOTICE: Official Microsoft Nuget Package is available now Microsoft.WindowsAPICodePack-Core Microsoft.WindowsAPICodePack-Shell

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

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

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

Install-Package WindowsAPICodePack-Shell
 09 авг. 2017 г., 11:16
Это выбирает один файл, а не папку ...
 09 апр. 2018 г., 16:34
@ Энтони нет, ты не будешь. Я только что подтвердил это. Оболочка должна быть добавлена вручную. Я проверял это в Visual Studio 2013. Не уверен насчет 2015, 2017 и т. Д.
 21 авг. 2017 г., 05:12
Это должно быть ответом. И обратите внимание, что вам нужно установитьMicrosoft.WindowsAPICodePack.Shell пакет через NuGet, прежде чем вы можете использовать этоCommonOpenFileDialog.
 30 мар. 2017 г., 10:52
Я думаю, что это ближайший ответ на вопрос "Как использовать OpenFileDialog для выбора папки?" FolderBrowseDialog очень непригоден для использования. Спасибо за этот ответ.
 29 мар. 2018 г., 20:28
@smwikipedia Я думаю, что если вы установите WindowsAPICodePack через Nuget, у вас автоматически установится .Shell. По крайней мере, это мой случай.

Посмотрите наOokii Dialogs библиотеки, в которых реализован диалог браузера папок для Windows Forms и WPF соответственно.

enter image description here

Ookii.Dialogs.WinForms

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

Ookii.Dialogs.Wpf

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

Решение Вопроса

В основном вам нужноFolderBrowserDialog учебный класс:

Prompts the user to select a folder. This class cannot be inherited.

Пример:

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 учебный класс

 12 мар. 2015 г., 21:27
@clairestreb, предложение в оригинальном посте. Он ссылается на решение, которое также использует OpenFileDialog для открытия папок. OP просто не может скомпилировать его, и мой комментарий описывает, как это сделать.
 24 июн. 2014 г., 17:25
FolderBrowserDialog не хватает удобства использования. Основным недостатком является то, что он не позволяет копировать путь к папке из Проводника Windows для быстрой навигации, что делает его бесполезным, когда вам необходимо детализировать более трех уровней. Детализация в каждой папке нежелательна, особенно когда хранилище медленное или когда у вас много папок на одном из уровней.
 19 авг. 2015 г., 15:12
Пожалуйста,don't ever use it! Я помню, как пользователь, я обвинял этих бедных программистов, которые сделали еще одно приложение с этим ужаснымtree view dialog (which is just the FolderBrowserDialog), Он совершенно непригоден для использования: куча корневых папок, отсутствующая панель избранного и самые ужасные & # x2014; Вы даже не можете вставить туда путь! И теперь, как программист, я вижу совет по его использованию & # x2026; Пожалуйста, не делайте этого.
 12 июн. 2015 г., 20:06
В качестве альтернативы этому диалогу со сломанным пользовательским интерфейсом, используйтеCommonOpenFileDialog: new CommonOpenFileDialog { IsFolderPicker = true }.
 15 июл. 2014 г., 22:30
Диалоги ookii (www.ookii.org/Software/Dialogs/) чрезвычайно полезны для этого.

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

 19 дек. 2016 г., 15:39
Я предполагаю, что это получает отрицательную оценку b / c (как уже указала мистика), FolderBrowserDialog имеет ужасное удобство использования, и OP явно хотел использовать OpenFileDialog.
 20 дек. 2016 г., 10:30
@mbx Возможно. Чтобы быть справедливым, OP не говорит "я не могу использовать ничего, кроме OpenFileDialog". Когда я первоначально ответил на это (более 4 с половиной лет назад ...), предполагалось, что ОП просто не знает, как позволить пользователю открыть папку. Я действительно не вернулся к этому вопросу после публикации этого ответа, поэтому я не видел ни одной дискуссии о юзабилити - и я не учел ее при ответе.

Есть хакерское решение, использующееOpenFileDialog гдеValidateNames а такжеCheckFileExists оба установлены в ложь и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);
    // ...
}
 24 февр. 2019 г., 06:18
@ComradeJoecool, вам не нужно вручную удалять это вручную. Вот для чего предназначена последняя строка в коде: string folderPath = Path.GetDirectoryName (folderBrowser.FileName);
 10 авг. 2018 г., 19:52
Это не работает для меня. Это не позволит мне выбрать папки. Это просто открывает их.
 10 мая 2018 г., 02:34
Я вижу, да, я получил это работает. Одна раздражающая вещь в том, чтоFolder Selection. будет прикреплен к концу имени файла так:C:\Folder Selection. Я думаю, вы всегда можете удалить эти символы из строки. По-прежнему выглядит лучше, чем FolderBrowserDialog
 11 авг. 2018 г., 03:46
@Lokiare Вот что я имел в виду, когда сказал, что это взлом. Смотрите инструкции из второго абзаца.

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

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

Для данного веб-сайта это общественное достояние: «Там нет лицензии, как таковой, так как вы можете взять и делать с кодом то, что вы будете». & Quot;

Article: .NET Win 7-style folder select dialog (http://www.lyquidity.com/devblog/?p=136) Source code: http://s3downloads.lyquidity.com/FolderSelectDialog/FolderSelectDialog.zip

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

Article: https://web.archive.org/web/20180823181552/http://www.lyquidity.com/devblog/?p=136 Source code: https://web.archive.org/web/20180823181632/http://s3downloads.lyquidity.com/FolderSelectDialog/FolderSelectDialog.zip
 22 февр. 2019 г., 17:52
Работай отлично! Также вы можете выбрать несколько папок, добавив эту строку в & quot; FolderSelectDialog.cs & quot; : public string [] FileNames {get {return ofd.FileNames; }} и change ofd.Multiselect = true; в конструкторе

Ваш ответ на вопрос