Come usare OpenFileDialog per selezionare una cartella?


297

Come usare OpenFileDialogper selezionare le cartelle?

Stavo per usare il seguente progetto: https://github.com/scottwis/OpenFileOrFolderDialog

Tuttavia, ho riscontrato un problema. Usa la GetOpenFileNamefunzione e la OPENFILENAMEstruttura. E OPENFILENAMEha il membro nominato templateID. È l'identificatore per il modello di dialogo. E il progetto contiene anche il res1.rcfile e la finestra di dialogo inizializzata. Ma non sono riuscito a capire come allegare questo file al mio progetto C #.

Esiste un modo migliore per utilizzare un OpenFileDialogper selezionare le cartelle?


Se apri il file di progetto con l'editor, noterai alcune proprietà aggiuntive in fondo: <VCIncludePath ...>, <Win32Resource ...> e <Target Name = "BeforeBuild" ...>. Vedrai che esegue rc.exe per compilare il file di risorse res1.rc (assicurati di copiare anche "resource.h" nel tuo progetto). Assicurati di avere VisualC installato e che VCIncludePath punti in una posizione corretta (quello di github punta alla versione VC9.0 e potrebbe essere necessario cambiarlo). Dopo aver compilato il file .rc, il file .res risultante viene aggiunto come risorsa per l'eseguibile con la direttiva Win32Resource.
mistika,

3
Esiste una soluzione hacker che utilizza OpenFileDialog dove ValidateNamese CheckFileExistssono entrambi impostati su false e FileNameviene assegnato un valore fittizio per indicare che è stata selezionata una directory. Dico hack perché confonde gli utenti su come selezionare una cartella. Vedi Seleziona file o cartella dalla stessa finestra di dialogo
Daniel Ballinger

1
Grazie Dan per aver puntato verso OpenFileDialog-Hack! È molto meglio di FolderBrowserDialog, perché OFD mostra cartelle con segnalibri ecc., Quindi tutti - specialmente nelle aziende più grandi - trovano la loro merda. FBD non farà molto bene in quei luoghi.
JayC667,

1
@ComradeJoecool Ho convertito il mio commento in una risposta . L'ho provato più volte e non ho riscontrato un problema "file non trovato". Stai riutilizzando la stessa istanza OpenFileDialog?
Daniel Ballinger,

1
@DanielBallinger ah, ho riscontrato il mio problema, poiché sto usando Powershell per creare la finestra di dialogo, l'impostazione ValidateNamese CheckFileExistsperché falsenon funzionava, dovevo impostarli su 0(o imparare meglio PowerShell)
CompagnoJoecool

Risposte:


397

Fondamentalmente hai bisogno della FolderBrowserDialogclasse:

Chiede all'utente di selezionare una cartella. Questa classe non può essere ereditata.

Esempio:

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

Se lavori in WPF devi aggiungere il riferimento a System.Windows.Forms.

devi anche aggiungere using System.IOper la Directorylezione


186
FolderBrowserDialog manca di usabilità. Lo svantaggio principale è che non consente di copiare il percorso di una cartella da Esplora risorse per una rapida navigazione, rendendolo inutile quando è necessario eseguire il drill down su più di tre livelli. Il drill in ogni cartella non è desiderato soprattutto quando l'archiviazione è lenta o quando ci sono molte cartelle a uno dei livelli.
mistika,

2
La domanda riguarda in particolare l'utilizzo di OpenFileDialog (OFD) per selezionare una cartella, non FolderBrowserDialog (FBD). Concordo sul fatto che l'FBD sia terribile dal punto di vista dell'utente.
Michael Paulukonis,

27
In alternativa a questa finestra con rotture di interfaccia utente, utilizzare un CommonOpenFileDialog : new CommonOpenFileDialog { IsFolderPicker = true }.
ANeves,

114
Per favore, non usarlo mai ! Ricordo che come utente stavo incolpando questi poveri programmatori che hanno realizzato ancora un'altra app con questa terribile finestra di dialogo ad albero (che è solo il FolderBrowserDialog) . È completamente inutilizzabile: un mucchio di dir root, un pannello dei preferiti mancante e il più orribile - non puoi nemmeno incollare un percorso lì! E ora come programmatore vedo un consiglio per usarlo ... Per favore, non farlo.
Ciao Angelo

2
FolderBrowserDialog ha un grosso difetto oltre a tutto ciò che gli altri utenti hanno detto. Non ricorda l'ultimo percorso selezionato!
AleX_

254

Come nota per i futuri utenti che vorrebbero evitare di utilizzarli FolderBrowserDialog, una volta Microsoft ha rilasciato un'API chiamata WindowsAPICodePack che aveva una finestra di dialogo utile chiamata CommonOpenFileDialog, che poteva essere impostata in una IsFolderPickermodalità. L'API è disponibile da Microsoft come pacchetto NuGet .

Questo è tutto ciò di cui avevo bisogno per installare e utilizzare il CommonOpenFileDialog. (NuGet ha gestito le dipendenze)

Install-Package Microsoft.WindowsAPICodePack-Shell

Per la linea di inclusione:

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

36
Penso che questa sia la risposta più vicina a "Come usare OpenFileDialog per selezionare una cartella?" FolderBrowseDialog è molto inutilizzabile. Grazie per questa risposta
Koray,

46
Questa dovrebbe essere la risposta. E si noti che è necessario installare il Microsoft.WindowsAPICodePack.Shellpacchetto tramite NuGet prima di poterlo utilizzare CommonOpenFileDialog.
smwikipedia,

1
Se lo usi con VS2017, ridisegna la finestra principale.
Lokiare,

1
Nota per gli FolderBrowserDialogutenti: l'utilizzo simultaneo di più istanze può creare problemi. È CommonOpenFileDialogmeglio
Alper,

9
Microsoft sembra averlo ripubblicato comeWindowsAPICodePack-Shell
NucS

32

Esiste una soluzione hacker che utilizza OpenFileDialogdove ValidateNamese CheckFileExistssono entrambi impostati su false e FileNameviene assegnato un valore fittizio per indicare che è stata selezionata una directory.

Dico hack perché confonde gli utenti su come selezionare una cartella. Devono essere nella cartella desiderata e quindi premere Apri mentre il nome del file dice "Selezione cartella".

Finestra di dialogo per la selezione della cartella C #

Questo si basa su Seleziona file o cartella dalla stessa finestra di dialogo di 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);
    // ...
}

Vedo, sì, l'ho fatto funzionare. Una cosa fastidiosa è che Folder Selection.verrà incollato alla fine del nome del file in questo modo: C:\Folder Selection.suppongo che potresti sempre rimuovere quei caratteri dalla stringa. Sembra ancora migliore di FolderBrowserDialog
ComradeJoecool

Questo non funziona per me. Non mi permetterà di selezionare le cartelle. Li apre appena.
Lokiare,

1
@Lokiare Questo è ciò che intendevo quando ho detto che era un trucco. Vedi le istruzioni del secondo paragrafo.
Daniel Ballinger,

2
@ComradeJoecool non devi rimuoverlo manualmente. ecco a cosa serve l'ultima riga del codice: string folderPath = Path.GetDirectoryName (folderBrowser.FileName);
Heriberto Lugo,

Oh! c'è un problema con questo metodo: se l'utente preme i pulsanti Su o Indietro durante la navigazione delle cartelle, il Openpulsante principale della finestra di dialogo non funziona come previsto! ti fa tornare alla cartella precedente! ma funziona quando fai doppio clic sulle cartelle per selezionarle o selezionare alcuni file all'interno di ciascuna cartella (se c'è qualche file che puoi scegliere)
S.Serpooshan

14

Strano che così tante risposte / voti, ma nessuno aggiunga il seguente codice come risposta:

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
C'è qualche differenza tra la tua risposta e @ Ionică Bizău Answer ?
Chetan Mehra,

1
La logica è la stessa, ma la mia risposta è molto più breve e non è necessario creare una variabile aggiuntiva per DialogResult.
Andrew

2
Come già accennato, ci sono alcuni grossi problemi con questo metodo: questa è una terribile finestra di dialogo ad albero! non è possibile copiare e incollare un percorso all'interno di esso, è necessario eseguire il drill uno per uno dalla cartella principale e non sono presenti pannelli preferiti!
S. Serpooshan,

@Serpooshan non importa. Questo è solo un esempio dell'uso di QUALSIASI finestra di dialogo. Se lo desideri, puoi utilizzare qualsiasi altra finestra di dialogo. :)
Andrew,

9

Mi sembra che tu sia appena dopo il FolderBrowserDialog .


5
Immagino che questo sia sottovalutato in b / c (come già sottolineato da mistika) FolderBrowserDialog ha un'usabilità orribile e OP ha esplicitamente voluto usare OpenFileDialog.
mbx,

3
@mbx Forse. Ad essere onesti, l'OP non dice "Non posso usare altro che OpenFileDialog". Quando inizialmente ho risposto a questa domanda (oltre 4 anni e mezzo fa ...), l'ipotesi era che l'OP non sapesse come permettere a un utente di aprire una cartella. In realtà non sono tornato a questa domanda dopo aver pubblicato questa risposta, quindi non ho visto nessuna discussione sull'usabilità, né l'ho considerata quando ho risposto.
Simon Whitehead,

6

Ecco un'altra soluzione, che ha tutta la fonte disponibile in un singolo, semplice file ZIP.

Presenta OpenFileDialog con flag di Windows aggiuntivi che lo fanno funzionare come la finestra di dialogo Selezione cartelle di Windows 7+.

Per il sito Web, è di dominio pubblico: "Non esiste una licenza in quanto sei libero di prendere e fare con il codice quello che vuoi".

Collegamenti Archive.org:


1
Funziona perfettamente !. Inoltre puoi farlo selezionare più cartelle aggiungendo questa riga in "FolderSelectDialog.cs": public string [] FileNames {get {return ofd.FileNames; }} e modifica ofd.Multiselect = true; nel costruttore
Maxter,

5

Dai un'occhiata alle librerie Ookii Dialogs che hanno un'implementazione di una finestra di dialogo del browser delle cartelle rispettivamente per Windows Forms e WPF.

inserisci qui la descrizione dell'immagine

Ookii.Dialogs.WinForms

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


Ookii.Dialogs.Wpf

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


bene. nota: Ookii.Dialogs richiede Microsoft .NET Framework 4.5 o versioni successive. (non utilizzabile in WinXP)
S.Serpooshan

2
@Serpooshan - Beh, immagino che non funzionerà nemmeno sul mio PC Windows 3.1, giusto? Ma sul serio, nel 2018, nessuno dovrebbe pensare a Windows XP, è morto da tempo.
rory.ap,

@ rory.ap in realtà, il problema principale di questa soluzione per me è che non mostra i file durante la ricerca di cartelle. A volte è molto utile poter vedere i file (ad es. Immagini da elaborare) quando l'utente vuole selezionare la cartella!
S. Serpooshan,

-5

questo dovrebbe essere il modo più ovvio e diretto

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è già stato offerto qui più volte ed è la risposta sbagliata. È un'interfaccia obsoleta e molto non user-friendly. Utilizza SHBrowseForFoldersotto, e persino i documenti dichiarano "Per Windows Vista o versioni successive, si consiglia di utilizzare IFileDialogcon l' FOS_PICKFOLDERSopzione anziché con la SHBrowseForFolderfunzione. Questa utilizza la finestra di dialogo Apri file in modalità di selezione cartelle ed è l'implementazione preferita."
Herohtar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.