Как использовать 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.
Ответ 6
Взгляните на библиотеки 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
Ответ 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;
}
}