2012-07-24 20 views
158

¿Cómo usar OpenFileDialog para seleccionar carpetas?¿Cómo usar OpenFileDialog para seleccionar una carpeta?

que iba a utilizar el siguiente proyecto: https://github.com/scottwis/OpenFileOrFolderDialog

Sin embargo, me enfrentaba a un problema. Utiliza la función GetOpenFileName y la estructura OPENFILENAME. Y OPENFILENAME tiene el miembro llamado templateID. Es el identificador para la plantilla de diálogo. Y el proyecto contiene el archivo res1.rc y el cuadro de diálogo init también. Pero no pude encontrar la manera de adjuntar este archivo a mi proyecto de C#.

¿Existe alguna forma mejor de usar un OpenFileDialog para seleccionar carpetas?

+0

Si abre el proyecto archivo con editor, verá algunas propiedades adicionales en la parte inferior: , y . 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 que VCIncludePath apunte a una ubicación adecuada (el de github apunta a la versión VC9.0, y es posible que necesite cambiarlo). Después de compilar el archivo .rc, el archivo .res resultante se agrega como el recurso para su ejecutable con la directiva Win32Resource. – mistika

+2

Hay una solución hackish usando OpenFileDialog donde 'ValidateNames' y' CheckFileExists' se establecen en false y 'FileName' recibe un valor falso para indicar que se ha seleccionado un directorio. Digo hack porque es confuso para los usuarios sobre cómo seleccionar una carpeta. Consulte [Seleccionar archivo o carpeta del mismo cuadro de diálogo] (http: //www.codeproject.com/Articles/44914/Select-file-or-folder-from-the-same-dialog) –

+0

Posible duplicado de [¿Cómo se configura un OpenFileDialog para seleccionar carpetas?] (http://stackoverflow.com/questions/31059/how-do-you-configure-an-openfiledialog-to-select-folders) –

Respuesta

272

Básicamente lo que necesita la clase FolderBrowserDialog:

pide 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 hay que agregar la referencia a System.Windows.Forms.

también hay que añadir using System.IO para Directory clase

+1

¿cuál es el uso de 'DialogResult result = fbd.ShowDialog();' en este código? – AminM

+1

@JesonPark Por lo que leí [aquí] (http://stackoverflow.com/q/14813506/1420197) se usa para asegurarme de que el usuario seleccionó una carpeta y todo estaba bien. En mi ejemplo, es inútil. Ver [esta respuesta] (http://stackoverflow.com/a/14827454/1420197) para más información. –

+88

FolderBrowserDialog's carece de usabilidad. La principal desventaja es que no le permite copiar una ruta de carpeta desde Windows Explorer para una navegación rápida, por lo que es 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

15

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

+2

Supongo que esto se degrada downvoted b/c (como ya se ha señalado mistika) el FolderBrowserDialog tiene una usabilidad horrible y OP explícitamente quería usar OpenFileDialog. – mbx

+1

@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 ...), se asumió que el OP simplemente no sabía cómo permitir que un usuario abra una carpeta. En realidad, no volví a esta pregunta después de publicar esta respuesta, así que no he visto ninguna discusión sobre usabilidad, ni la consideré al responder. –

12

extraño que tanto las respuestas/votos, pero nadie añada el siguiente código como respuesta:

using (var folderDialog = new FolderBrowserDialog()) 
{ 
    if (folderDialog.ShowDialog() == DialogResult.OK) 
    { 

     // folderDialog.SelectedPath -- your result 
    } 
} 
+0

¿Hay alguna diferencia entre su respuesta y @Ionică Bizău [Respuesta] (https://stackoverflow.com/questions/11624298/how-to-use-openfiledialog-to-select-a-folder/11624322#11624322)? –

+0

La lógica es la misma, pero mi respuesta es mucho más corta y no es necesario crear una variable adicional para DialogResult. – Andrew

63

Como nota para los futuros usuarios que quisiera evitar el uso de FolderBrowserDialog, Microsoft solía lanzar una API llamada WindowsAPICodePack que tenía un diálogo útil llamado CommonOpenFileDialog, que se podía establecer en un modo IsFolderPicker.

Si usted tiene acceso a Nuget paquetes, este sigue estando disponible en las listas públicas como WindowsAPICodePack

Para la línea incluyen:

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); 
} 
+5

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

+0

Este es un gran hallazgo, muchas gracias. ¡He estado buscando toda la tarde algo así de fácil! – Taegost

+0

Esto selecciona un archivo, no una carpeta ... – miguelmpn

Cuestiones relacionadas