¿Cómo usar OpenFileDialog para seleccionar una carpeta?

297

¿Cómo usar OpenFileDialogpara seleccionar carpetas?

Iba a usar el siguiente proyecto: https://github.com/scottwis/OpenFileOrFolderDialog

Sin embargo, me enfrenté a un problema. Utiliza la GetOpenFileNamefunción y la OPENFILENAMEestructura. Y OPENFILENAMEtiene el miembro nombrado templateID. Es el identificador para la plantilla de diálogo. Y el proyecto contiene el res1.rcarchivo y el diálogo de inicio de plantilla también. Pero no pude descubrir cómo adjuntar este archivo a mi proyecto C #.

¿Hay una mejor manera de usar un OpenFileDialogpara seleccionar carpetas?

Yun
fuente
Si abre el archivo del proyecto con el editor, notará algunas propiedades adicionales en la parte inferior: <VCIncludePath ...>, <Win32Resource ...> y <Target Name = "BeforeBuild" ...>. Verá que ejecuta rc.exe para compilar el archivo de recursos res1.rc (asegúrese de copiar también el "resource.h" en su proyecto). Asegúrese de tener instalado VisualC y de que VCIncludePath apunte a una ubicación adecuada (uno de github apunta a la versión VC9.0, y es posible que deba cambiarlo). Después de compilar el archivo .rc, el archivo .res resultante se agrega como recurso para su ejecutable con la directiva Win32Resource.
mistika
3
Hay una solución hacker usando OpenFileDialog donde ValidateNamesy CheckFileExistsson establecen en falso y FileNamese le da un valor simulada para indicar que se ha seleccionado un directorio. Digo hackear porque confunde a los usuarios sobre cómo seleccionar una carpeta. Consulte Seleccionar archivo o carpeta desde el mismo cuadro de diálogo
Daniel Ballinger,
1
Gracias Dan por apuntar hacia el OpenFileDialog-Hack! Eso es mucho mejor que FolderBrowserDialog, porque OFD muestra carpetas marcadas, etc., por lo que todos, especialmente en compañías más grandes, encuentran su basura. FBD no hará mucho bien en esos lugares.
JayC667
1
@ComradeJoecool He convertido mi comentario en una respuesta . Lo intenté varias veces y no tuve un problema de "archivo no encontrado". ¿Estás reutilizando la misma instancia de OpenFileDialog?
Daniel Ballinger
1
@DanielBallinger ah, me encontré con mi problema, ya que estoy usando Powershell para crear el diálogo, el establecimiento ValidateNamesy CheckFileExistsque falseno estaba trabajando, tenía que ponerlos a 0(o aprender PowerShell mejor)
ComradeJoecool

Respuestas:

397

Básicamente necesitas la FolderBrowserDialogclase:

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 trabaja en WPF , debe agregar la referencia System.Windows.Forms.

también tienes que agregar using System.IOpara la Directoryclase

Ionică Bizău
fuente
186
FolderBrowserDialog carece de usabilidad. La principal desventaja es que no le permite copiar una ruta de carpeta desde el Explorador de Windows para una navegación rápida, lo que lo hace inútil cuando necesita profundizar en más de tres niveles. No se desea profundizar en cada carpeta, especialmente cuando el almacenamiento es lento o cuando tiene muchas carpetas en uno de los niveles.
mistika
2
La pregunta es específicamente sobre el uso de OpenFileDialog (OFD) para seleccionar una carpeta, no FolderBrowserDialog (FBD). Estoy de acuerdo en que el FBD es horrible desde el punto de vista del usuario.
Michael Paulukonis
27
Como alternativa a este cuadro de diálogo con IU roto, use un CommonOpenFileDialog : new CommonOpenFileDialog { IsFolderPicker = true }.
ANeves
114
¡Por favor, nunca lo uses ! Recuerdo que, como usuario, estaba culpando a estos pobres programadores que crearon otra aplicación con este horrible cuadro de diálogo de vista de árbol (que es solo el FolderBrowserDialog) . Es completamente inutilizable: un montón de directorios raíz, un panel de favoritos perdido y lo más horrible: ¡ni siquiera puede pegar un camino allí! Y ahora como programador veo un consejo para usarlo ... Por favor, no lo hagas.
Hola-Angel
2
FolderBrowserDialog tiene una gran falla además de todo lo demás que dijeron los otros usuarios. ¡No recuerda la última ruta seleccionada!
AleX_
254

Como una nota para los futuros usuarios que deseen evitar el uso FolderBrowserDialog, Microsoft una vez lanzó una API llamada WindowsAPICodePack que tenía un diálogo útil llamado CommonOpenFileDialog, que podría establecerse en un IsFolderPickermodo. La API está disponible de Microsoft como un 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);
}
Joe
fuente
36
Creo que esta es la respuesta más cercana a "¿Cómo usar OpenFileDialog para seleccionar una carpeta?" FolderBrowseDialog es muy inutilizable. Gracias por esta respuesta
Koray
46
Esta debería ser la respuesta. Y tenga en cuenta que necesita instalar el Microsoft.WindowsAPICodePack.Shellpaquete a través de NuGet antes de poder usar esto CommonOpenFileDialog.
smwikipedia
1
Si usa esto con VS2017, rediseña su ventana principal.
Lokiare
1
Nota para los FolderBrowserDialogusuarios: el uso de varias instancias simultáneas puede crear problemas. Esto CommonOpenFileDialoges mejor
Alper
99
Microsoft parece haberlo republicado comoWindowsAPICodePack-Shell
NucS
32

Hay una solución pirata que usa OpenFileDialogwhere ValidateNamesy CheckFileExistsse establece en false y FileNamese le asigna un valor simulado para indicar que se ha seleccionado un directorio.

Digo hackear porque confunde a los usuarios sobre 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".

Diálogo de selección de carpeta C #

Esto se basa en Seleccionar archivo o carpeta del mismo cuadro de diálogo por 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);
    // ...
}
Daniel Ballinger
fuente
Ya veo, sí, lo tengo funcionando. Una cosa molesta es que se Folder Selection.agregará al final del nombre del archivo de la siguiente manera: C:\Folder Selection.supongo que siempre puedes eliminar esos caracteres de la cadena. Todavía se ve mejor que el FolderBrowserDialog
ComradeJoecool
Esto no funciona para mi. No me permitirá seleccionar carpetas. Simplemente los abre.
Lokiare
1
@Lokiare A eso me refería cuando dije que era un hack. Vea las instrucciones del segundo párrafo.
Daniel Ballinger el
2
@ComradeJoecool no tiene que eliminarlo manualmente. para eso es la última línea del código: string folderPath = Path.GetDirectoryName (folderBrowser.FileName);
Heriberto Lugo
Oh! hay un problema con este método: si el usuario presiona los botones Arriba o Atrás al explorar las carpetas, ¡el Openbotón principal del cuadro de diálogo no funciona como se esperaba! ¡porque saltas a la carpeta anterior! pero funciona cuando solo hace doble clic en las carpetas para seleccionarlas o selecciona algunos archivos dentro de cada carpeta (si hay algún archivo que pueda elegir)
S.Serpooshan
14

Es extraño que haya tantas respuestas / votos, pero nadie agrega el siguiente código como respuesta:

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
    }
}
Andrés
fuente
99
¿Hay alguna diferencia entre su respuesta y @ Ionică Bizau respuesta ?
Chetan Mehra
1
La lógica es la misma, pero mi respuesta es mucho más corta y no es necesario crear variables adicionales para DialogResult.
Andrew
2
Como ya se mencionó, hay algunos grandes problemas con este método: ¡este es un cuadro de diálogo de vista de árbol horrible! no puede copiar y pegar una ruta en él, debe explorar uno por uno desde la carpeta raíz y no hay un panel de favoritos.
S.Serpooshan
@ S.Serpooshan no importa. Esto es solo una muestra del uso de CUALQUIER diálogo. Puede usar cualquier otro diálogo si lo desea. :)
Andrew
9

Me parece que estás justo después del FolderBrowserDialog .

Simon Whitehead
fuente
55
Supongo que esto está siendo votado negativamente b / c (como ya señaló mistika) el FolderBrowserDialog tiene una usabilidad horrible y OP explícitamente quería usar OpenFileDialog.
mbx
3
@mbx Quizás. Para ser justos, el OP no dice "No puedo usar nada más que OpenFileDialog". Cuando originalmente respondí esto (hace más de 4 años y medio ...), la suposición era que el OP simplemente no sabía cómo permitir que un usuario abriera una carpeta. En realidad, no volví a esta pregunta después de publicar esta respuesta, por lo que no he visto ninguna discusión sobre la usabilidad, ni la consideré al responder.
Simon Whitehead
6

Aquí hay otra solución, que tiene toda la fuente disponible en un único archivo ZIP simple.

Presenta OpenFileDialog con indicadores adicionales de Windows que lo hacen funcionar como el diálogo de Selección de Carpeta de Windows 7+.

Según el sitio web, es de dominio público: "No hay licencia como tal, ya que es libre de tomar y hacer con el código lo que quiera".

Enlaces de Archive.org:

Ben Keene
fuente
1
¡Funciona perfectamente! También puede hacer que seleccione varias carpetas agregando esta línea en "FolderSelectDialog.cs": cadena pública [] FileNames {get {return ofd.FileNames; }} y cambio de d.Multiselect = true; en el constructor
Maxter
5

Eche un vistazo a las bibliotecas Ookii Dialogs que tienen una implementación de un diálogo de carpeta para Windows Forms y WPF respectivamente.

ingrese la descripción de la imagen aquí

Ookii.Dialogs.WinForms

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


Ookii.Dialogs.Wpf

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

C. Augusto Proiete
fuente
bueno. nota: Ookii.Dialogs requiere Microsoft .NET Framework 4.5 o superior. (no se puede usar en WinXP)
S.Serpooshan
2
@ S.Serpooshan - Bueno, supongo que tampoco funcionará en mi PC con Windows 3.1, ¿verdad? Pero en serio, en 2018, nadie debería pensar en Windows XP de todos modos: hace mucho que murió.
rory.ap
@ rory.ap en realidad, el principal problema de esta solución para mí es que no muestra los archivos al buscar carpetas. A veces es muy útil poder ver los archivos (p. Ej., Imágenes a procesar) cuando el usuario quiere seleccionar la carpeta.
S.Serpooshan
-5

esta debería ser la forma más obvia y directa

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

}
AHM
fuente
3
FolderBrowserDialogya se ha ofrecido aquí varias veces, y es la respuesta incorrecta. Es una interfaz obsoleta y muy poco amigable para el usuario. Se usa SHBrowseForFolderdebajo, e incluso los documentos dicen "Para Windows Vista o posterior, se recomienda usar IFileDialogcon la FOS_PICKFOLDERSopción en lugar de la SHBrowseForFolderfunción. Esto usa el cuadro de diálogo Abrir archivos en el modo de selección de carpetas y es la implementación preferida".
Herohtar