Як використовувати OpenFileDialog для вибору папки?


296

Як використовувати OpenFileDialogдля вибору папок?

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

Однак я зіткнувся з однією проблемою. Він використовує GetOpenFileNameфункцію та OPENFILENAMEструктуру. І OPENFILENAMEмає ім'я члена templateID. Це ідентифікатор діалогового шаблону. І проект містить res1.rcфайл і шаблонне діалогове вікно також. Але я не міг зрозуміти, як долучити цей файл до свого проекту C #.

Чи є кращий спосіб використовувати OpenFileDialogпапку для вибору папок?


Якщо ви відкриєте файл проекту в редакторі, ви побачите деякі додаткові властивості внизу: <VCIncludePath ...>, <Win32Resource ...> та <Target Name = "BeforeBuild" ...>. Ви побачите, що він запускає rc.exe для збирання файлу ресурсу res1.rc (обов'язково скопіюйте "resource.h" у свій проект). Переконайтеся, що у вас встановлений VisualC і що VCIncludePath вказує на правильне розташування (один github вказує на версію VC9.0, і вам може знадобитися змінити його). Після компіляції .rc-файлу отриманий .res-файл додається як ресурс для вашого виконуваного файлу з директивою Win32Resource.
mistika

3
Існує хакізальне рішення з використанням OpenFileDialog, де ValidateNamesі CheckFileExistsобидва встановлені в false, і FileNameнадається значення макета, яке вказує на те, що вибрано каталог. Я кажу хак, тому що це заплутує користувачів щодо того, як вибрати папку. Див. Вибір файлу чи папки з того самого діалогу
Даніель Баллінгер

1
Дякуємо Дену за вказівку на OpenFileDialog-Hack! Це набагато краще, ніж FolderBrowserDialog, оскільки OFD показує папки із закладками тощо, тому всі, особливо у великих компаніях, знаходять своє лайно. ФБР не принесе багато користі в тих місцях.
JayC667,

1
@ComradeJoecool Я перетворив свій коментар у відповідь . Я спробував це кілька разів і не виникло проблеми з "файлом не знайдено". Ви повторно використовуєте той самий екземпляр OpenFileDialog?
Даніель Баллінгер

1
@DanielBallinger ах, я виявив свою проблему, оскільки я використовую Powershell для створення діалогового вікна, налаштування ValidateNamesі, CheckFileExistsщоб falseвін не працював, мені потрібно було встановити їх 0(або навчитися краще)
ComradeJoecool

Відповіді:


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.IOдля Directoryкласу


184
FolderBrowserDialog не має зручності використання. Основним недоліком є ​​те, що він не дозволяє скопіювати шлях до папки з Провідника Windows для швидкої навігації, що робить його марним, коли вам потрібно прокрутити більше трьох рівнів. Бурхливість у кожну папку не бажана, особливо коли зберігання повільне або коли у вас є багато папок на одному з рівнів.
mistika

2
Питання полягає саме у використанні OpenFileDialog (OFD) для вибору папки, а не FolderBrowserDialog (FBD). Я погоджуюся, що ФБР жахливий з точки зору користувача.
Майкл Паулуконіс

25
Як альтернатива до цього діалогу з розбитою UI, використовуйте CommonOpenFileDialog : new CommonOpenFileDialog { IsFolderPicker = true }.
ANeves

113
Будь ласка, ніколи не використовуйте його ! Я пам’ятаю, як користувач звинувачував цих бідних програмістів, які зробили ще одну програму з цим жахливим діалоговим вікном перегляду дерев (що є лише FolderBrowserDialog) . Це абсолютно непридатно: купа корінних брусів, відсутні панелі вибраних та найжахливіше - ви навіть не можете вставити туди шлях! І тепер, як програміст, я бачу пораду використовувати його ... Будь ласка, не робіть цього.
Привіт-Ангел

2
FolderBrowserDialog має один великий недолік, окрім всього іншого, про що говорили інші користувачі. Він не пам’ятає останнього вибраного шляху!
AleX_

252

Як замітка для майбутніх користувачів, які хотіли б уникати використання FolderBrowserDialog, Microsoft одного разу випустила API під назвою WindowsAPICodePack, який мав корисний діалог CommonOpenFileDialog, який можна було встановити в IsFolderPickerрежим. API доступний від Microsoft як пакет NuGet .

Це все, що мені потрібно було встановити та використовувати 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);
}

36
Я думаю, що це найближча відповідь до "Як використовувати OpenFileDialog для вибору папки?" FolderBrowseDialog дуже непридатний. Дякую за цю відповідь.
Корай

46
Це має бути відповіддю. І зауважте, що вам потрібно встановити Microsoft.WindowsAPICodePack.Shellпакунок через NuGet, перш ніж використовувати його CommonOpenFileDialog.
smwikipedia

1
Якщо ви використовуєте це з VS2017, він рестайлить ваше головне вікно.
Локіаре

1
Примітка для FolderBrowserDialogкористувачів: багаторазове використання його одночасно може створити проблеми. Це CommonOpenFileDialogкраще.
Альпер

9
Microsoft, схоже, перевидала це якWindowsAPICodePack-Shell
NucS

32

Існує рішення хакі, яке використовує OpenFileDialogде ValidateNamesі CheckFileExistsвстановлено значення false, і FileNameнадається значення макета, яке вказує на те, що вибрано каталог.

Я кажу хак, тому що це заплутує користувачів щодо того, як вибрати папку. Вони повинні знаходитись у потрібній папці, а потім просто натискати кнопку "Відкрити", коли назва файлу говорить "Вибір папки".

C # Діалогове вікно вибору папок

Це засновано на виборі файла чи папки з того самого діалогу Дениса Станковського.

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
ComradeJoecool

Це не працює для мене. Це не дозволить мені вибрати папки. Це просто їх відкриває.
Локіаре

1
@Lokiare Це я мав на увазі, коли сказав, що це хак. Дивіться інструкції з другого пункту.
Даніель Баллінгер

2
@ComradeJoecool вам не доведеться видаляти це вручну. ось що є останнім рядком у коді: string folderPath = Path.GetDirectoryName (папкаBrowser.FileName);
Херіберто Луго

Ой! є проблема з цим методом: якщо користувач натискає кнопки Вгору чи Назад під час перегляду папок, головна Openкнопка діалогового вікна працює не так, як очікувалося! це змушує вас перейти назад до папки prev! але це спрацьовує, коли ви лише двічі клацніть папки, щоб вибрати їх або вибрати деякі файли всередині кожної папки (якщо є якийсь файл, який ви можете вибрати)
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ă Bizau Відповідь ?
Четан Мехра

1
Логіка однакова, але моя відповідь набагато коротша, і вам не потрібно створювати додаткову змінну для DialogResult.
Андрій

2
Як уже згадувалося, у цього методу є деякі великі проблеми: це жахливий діалог перегляду дерев! ви не можете скопіювати і вставити шлях до нього, вам потрібно просвердлити по черзі з кореневої папки, і немає панелі вибраних!
S.Serpooshan

@ S.Serpooshan це не має значення. Це лише зразок використання БУДЬ-якого діалогового вікна. Ви можете використовувати будь-яке інше діалогове вікно, якщо хочете. :)
Андрій

9

Мені здається, що ви тільки після FolderBrowserDialog .


5
Я думаю, що це стає зниженим b / c (як вже вказувала mistika) FolderBrowserDialog має жахливу зручність використання, і OP явно хотів використовувати OpenFileDialog.
mbx

3
@mbx Можливо. Справедливості чесно, в ОП не сказано: "Я не можу використовувати нічого, крім OpenFileDialog". Коли я спочатку відповів на це (понад 4 з половиною роки тому ...), було припущення, що ОП просто не знає, як дозволити користувачу відкрити папку. Я фактично не повернувся до цього питання після публікації цієї відповіді, тому я не бачив жодної дискусії навколо зручності використання - і не вважав це, коли відповідав.
Саймон Уайтхед

6

Ось ще одне рішення, у якому все джерело доступне в одному простому ZIP-файлі.

У ньому представлено OpenFileDialog з додатковими прапорами Windows, завдяки чому він працює як діалогове вікно вибору папок Windows 7+.

На веб-сайті це загальнодоступне надбання: "Немає жодної ліцензії, як ви можете вільно брати і робити з кодом те, що вам потрібно".

Архів.org посилання:


1
Працюють чудово !. Також ви можете змусити його вибрати декілька папок, додавши цей рядок у "FolderSelectDialog.cs": public string [] FileNames {get {return ofd.FileNames; }} та змінаd.Multiselect = true; у конструкторі
Макстер

5

Погляньте на бібліотеки діалогів Ookii, яка має реалізацію діалогового вікна браузера папок для 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, правда? Але якщо серйозно, то в 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 або пізнішої версії рекомендується використовувати IFileDialogз FOS_PICKFOLDERSопцією, а не SHBrowseForFolderфункцією. Для цього використовується діалогове вікно" Відкрити файли "в режимі вибору папок і є бажаною реалізацією."
Герохтар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.