Solución:
Básicamente necesitas el FolderBrowserDialog
clase:
Solicita al usuario que seleccione una carpeta. Esta clase no puede heredarse.
Ejemplo:
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");
}
}
Si trabajas en WPF tienes que agregar la referencia a System.Windows.Forms
.
también tienes que agregar using System.IO
por Directory
clase
Como nota para los futuros usuarios que deseen evitar el uso FolderBrowserDialog
, Microsoft lanzó una vez una API llamada WindowsAPICodePack que tenía un cuadro de diálogo útil llamado CommonOpenFileDialog
, que podría establecerse en un IsFolderPicker
modo. La API está disponible en Microsoft como paquete NuGet.
Esto es todo lo que necesitaba para instalar y usar el CommonOpenFileDialog
. (NuGet manejó las dependencias)
Install-Package Microsoft.WindowsAPICodePack-Shell
Para la línea de inclusión:
using Microsoft.WindowsAPICodePack.Dialogs;
Uso:
CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\Users";
dialog.IsFolderPicker = true;
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
MessageBox.Show("You selected: " + dialog.FileName);
}
Hay una solución pirata que usa OpenFileDialog
dónde ValidateNames
y CheckFileExists
ambos se establecen en falso y FileName
recibe un valor simulado para indicar que se ha seleccionado un directorio.
Digo piratear porque a los usuarios les resulta confuso cómo seleccionar una carpeta. Deben estar en la carpeta deseada y luego presionar Abrir mientras el nombre del archivo dice “Selección de carpeta”.
Esto se basa en Seleccionar archivo o carpeta del mismo cuadro de diálogo de 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);
// ...
}