Comment utiliser OpenFileDialog pour sélectionner un dossier?

297

Comment utiliser OpenFileDialogpour sélectionner des dossiers?

J'allais utiliser le projet suivant: https://github.com/scottwis/OpenFileOrFolderDialog

Cependant, j'ai rencontré un problème. Il utilise la GetOpenFileNamefonction et la OPENFILENAMEstructure. Et OPENFILENAMEa nommé le membre templateID. C'est l'identifiant du modèle de dialogue. Et le projet contient leres1.rc fichier et l'initialisation de la boîte de dialogue. Mais je n'ai pas pu comprendre comment attacher ce fichier à mon projet C #.

Existe-t-il une meilleure façon d'utiliser un OpenFileDialogpour sélectionner des dossiers?

Yun
la source
Si vous ouvrez le fichier de projet avec l'éditeur, vous remarquerez quelques propriétés supplémentaires en bas: <VCIncludePath ...>, <Win32Resource ...> et <Target Name = "BeforeBuild" ...>. Vous verrez qu'il exécute rc.exe pour compiler le fichier de ressources res1.rc (veillez également à copier le "resource.h" dans votre projet). Assurez-vous que VisualC est installé et que VCIncludePath pointe vers un emplacement approprié (celui de github pointe vers la version VC9.0, et vous devrez peut-être le changer). Après avoir compilé le fichier .rc, le fichier .res résultant est ajouté en tant que ressource pour votre exécutable avec la directive Win32Resource.
mistika
3
Il existe une solution de piratage utilisant OpenFileDialog où ValidateNameset CheckFileExistssont tous deux définis sur false et FileNamereçoit une valeur factice pour indiquer qu'un répertoire est sélectionné. Je dis pirater, car il est déroutant pour les utilisateurs de sélectionner un dossier. Voir Sélectionner un fichier ou un dossier dans la même boîte de dialogue
Daniel Ballinger
1
Merci Dan pour avoir pointé le OpenFileDialog-Hack! C'est bien mieux que FolderBrowserDialog, car OFD montre des dossiers marqués, etc., donc tout le monde - en particulier dans les grandes entreprises - trouve sa merde. FBD ne fera pas beaucoup de bien dans ces endroits.
JayC667
1
@ComradeJoecool J'ai converti mon commentaire en réponse . Je l'ai essayé plusieurs fois et je n'ai pas rencontré de problème de "fichier introuvable". Réutilisez-vous la même instance OpenFileDialog?
Daniel Ballinger
1
@DanielBallinger ah, j'ai trouvé mon problème, puisque je suis en utilisant Powershell pour créer le dialogue, la mise ValidateNameset CheckFileExistsà falsene fonctionnait pas, je devais les mettre à 0(ou apprendre Powershell mieux)
ComradeJoecool

Réponses:

397

Fondamentalement, vous avez besoin de la FolderBrowserDialogclasse:

Invite l'utilisateur à sélectionner un dossier. Cette classe ne peut pas être héritée.

Exemple:

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 vous travaillez dans WPF, vous devez ajouter la référence àSystem.Windows.Forms .

vous devez également ajouter using System.IOpour la Directoryclasse

Ionică Bizău
la source
186
FolderBrowserDialog manque de convivialité. Le principal inconvénient est qu'il ne vous permet pas de copier un chemin de dossier à partir de l'Explorateur Windows pour une navigation rapide, le rendant inutile lorsque vous devez explorer plus de trois niveaux. Le perçage dans chaque dossier n'est pas souhaité, en particulier lorsque le stockage est lent ou lorsque vous avez beaucoup de dossiers à l'un des niveaux.
mistika
2
La question concerne spécifiquement l'utilisation de l'OpenFileDialog (OFD) pour sélectionner un dossier, pas le FolderBrowserDialog (FBD). Je suis d'accord que le FBD est horrible du point de vue de l'utilisateur.
Michael Paulukonis
27
Vous pouvez également à cette boîte de dialogue avec l' interface utilisateur cassé, utilisez un CommonOpenFileDialog : new CommonOpenFileDialog { IsFolderPicker = true }.
ANeves
114
S'il vous plaît, ne l'utilisez jamais ! Je me souviens qu'en tant qu'utilisateur, je blâmais ces pauvres programmeurs qui avaient créé une autre application avec cette horrible boîte de dialogue d'arborescence (qui n'est que le FolderBrowserDialog) . Il est complètement inutilisable: un tas de répertoires racine, un panneau de favoris manquant et le plus horrible - vous ne pouvez même pas y coller un chemin! Et maintenant, en tant que programmeur, je vois un conseil pour l'utiliser… S'il vous plaît, ne le faites pas.
Hi-Angel
2
FolderBrowserDialog a un gros défaut en plus de tout ce que les autres utilisateurs ont dit. Il ne se souvient pas du dernier chemin sélectionné!
AleX_
254

Pour les futurs utilisateurs qui souhaitent éviter d'utiliser FolderBrowserDialog, Microsoft a publié une fois une API appelée WindowsAPICodePack qui avait une boîte de dialogue utile appelée CommonOpenFileDialog, qui pouvait être définie dans un IsFolderPickermode. L'API est disponible auprès de Microsoft en tant que package NuGet .

C'est tout ce dont j'avais besoin pour installer et utiliser le CommonOpenFileDialog. (NuGet a géré les dépendances)

Install-Package Microsoft.WindowsAPICodePack-Shell

Pour la ligne d'inclusion:

using Microsoft.WindowsAPICodePack.Dialogs;

Usage:

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
    MessageBox.Show("You selected: " + dialog.FileName);
}
Joe
la source
36
Je pense que c'est la réponse la plus proche de "Comment utiliser OpenFileDialog pour sélectionner un dossier?" FolderBrowseDialog est très inutilisable. Merci pour cette réponse.
Koray
46
Cela devrait être la réponse. Et notez que vous devez installer le Microsoft.WindowsAPICodePack.Shellpackage via NuGet avant de pouvoir l'utiliser CommonOpenFileDialog.
smwikipedia
1
Si vous l'utilisez avec VS2017, il redessine votre fenêtre principale.
Lokiare
1
Remarque pour les FolderBrowserDialogutilisateurs: l'utilisation simultanée de plusieurs instances de celui-ci peut créer des problèmes. C'est CommonOpenFileDialogmieux.
Alper
9
Microsoft semble l'avoir republié sous le nomWindowsAPICodePack-Shell
NucS
32

Il existe une solution de piratage utilisant OpenFileDialogValidateNameset CheckFileExistssont tous deux définis sur false et FileNamereçoit une valeur factice pour indiquer qu'un répertoire est sélectionné.

Je dis pirater, car il est déroutant pour les utilisateurs de sélectionner un dossier. Ils doivent être dans le dossier souhaité, puis appuyez simplement sur Ouvrir pendant que le nom du fichier dit "Sélection du dossier".

Boîte de dialogue de sélection de dossier C #

Ceci est basé sur Sélectionner un fichier ou un dossier dans la même boîte de dialogue par 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
la source
Je vois, oui je l'ai fait fonctionner. Une chose ennuyeuse est que Folder Selection.cela sera collé à la fin du nom de fichier comme ceci: C:\Folder Selection.je suppose que vous pouvez toujours supprimer ces caractères de la chaîne. Est toujours meilleur que le FolderBrowserDialog
ComradeJoecool
Ça ne marche pas pour moi. Cela ne me permettra pas de sélectionner des dossiers. Cela les ouvre simplement.
Lokiare
1
@Lokiare C'est ce que je voulais dire quand j'ai dit que c'était un hack. Voir les instructions du deuxième paragraphe.
Daniel Ballinger
2
@ComradeJoecool, vous n'avez pas besoin de le supprimer manuellement. c'est à cela que sert la dernière ligne du code: string folderPath = Path.GetDirectoryName (folderBrowser.FileName);
Heriberto Lugo
Oh! il y a un problème avec cette méthode: si l'utilisateur appuie sur les boutons Haut ou Retour lors de la navigation dans les dossiers, le Openbouton principal de la boîte de dialogue ne fonctionne pas comme prévu! cela vous fait revenir au dossier précédent! mais cela fonctionne lorsque vous double-cliquez simplement sur des dossiers pour les sélectionner ou sélectionnez des fichiers à l'intérieur de chaque dossier (s'il y a un fichier que vous pouvez choisir)
S.Serpooshan
14

Étrange que tant de réponses / votes, mais personne n'ajoute le code suivant comme réponse:

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
    }
}
Andrew
la source
9
Y a-t-il une différence entre votre réponse et @ Ionică Bizău Answer ?
Chetan Mehra
1
La logique est la même, mais ma réponse est beaucoup plus courte et vous n'avez pas besoin de créer de variable supplémentaire pour DialogResult.
Andrew
2
Comme déjà mentionné, il y a de gros problèmes avec cette méthode: c'est une horrible boîte de dialogue d'arborescence! vous ne pouvez pas copier-coller un chemin d'accès, vous devez forer un par un à partir du dossier racine et il n'y a pas de panneau de favoris!
S.Serpooshan
@ S.Serpooshan ce n'est pas grave. Ceci n'est qu'un exemple d'utilisation de TOUT dialogue. Vous pouvez utiliser n'importe quelle autre boîte de dialogue si vous le souhaitez. :)
Andrew
9

Cela me semble être juste après le FolderBrowserDialog .

Simon Whitehead
la source
5
Je suppose que cela devient un vote négatif (comme Mistika l'a déjà souligné), le FolderBrowserDialog a une utilisabilité horrible et OP voulait explicitement utiliser OpenFileDialog.
mbx
3
@mbx Peut-être. Pour être juste, l'OP ne dit pas "je ne peux pas utiliser autre chose que l'OpenFileDialog". Lorsque j'ai répondu à l'origine à cette question (il y a plus de 4 ans et demi ...), l'hypothèse était que l'OP ne savait tout simplement pas comment laisser un utilisateur ouvrir un dossier. Je ne suis pas retourné à cette question après avoir posté cette réponse, donc je n'ai vu aucune discussion sur la convivialité - je ne l'ai pas non plus considérée lors de la réponse.
Simon Whitehead
6

Voici une autre solution, qui a toutes les sources disponibles dans un seul fichier ZIP simple.

Il présente l'OpenFileDialog avec des indicateurs de fenêtres supplémentaires qui le font fonctionner comme la boîte de dialogue de sélection de dossier de Windows 7+.

Selon le site Web, c'est du domaine public: "Il n'y a pas de licence en tant que telle, vous êtes libre de prendre et de faire ce que vous voulez avec le code."

Liens Archive.org:

Ben Keene
la source
1
Fonctionne parfaitement!. Vous pouvez également lui faire sélectionner plusieurs dossiers en ajoutant cette ligne dans "FolderSelectDialog.cs": chaîne publique [] FileNames {get {return ofd.FileNames; }} et changez de d.Multiselect = true; dans le constructeur
Maxter
5

Jetez un œil aux bibliothèques Ookii Dialogs qui ont une implémentation d'une boîte de dialogue de navigateur de dossier pour Windows Forms et WPF respectivement.

entrez la description de l'image ici

Ookii.Dialogs.WinForms

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


Ookii.Dialogs.Wpf

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

C. Augusto Proiete
la source
bien. remarque: Ookii.Dialogs nécessite Microsoft .NET Framework 4.5 ou supérieur. (ne peut pas être utilisé dans WinXP)
S.Serpooshan
2
@ S.Serpooshan - Eh bien, je suppose que cela ne fonctionnera pas non plus sur mon PC Windows 3.1, non? Mais sérieusement, en 2018, personne ne devrait de toute façon penser à Windows XP - il est mort depuis longtemps.
rory.ap
@ rory.ap en fait, le principal problème de cette solution pour moi est qu'elle n'affiche pas les fichiers lors de la recherche de dossiers. Il est parfois très utile de pouvoir visualiser les fichiers (par exemple les images à traiter) lorsque l'utilisateur souhaite sélectionner le dossier!
S.Serpooshan
-5

cela devrait être le moyen le plus évident et le plus simple

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
la source
3
FolderBrowserDialoga déjà été proposé ici plusieurs fois et n'est pas la bonne réponse. C'est une interface obsolète et très peu conviviale. Il utilise en SHBrowseForFolderdessous, et même l'état des documents "Pour Windows Vista ou version ultérieure, il est recommandé d'utiliser IFileDialogavec l' FOS_PICKFOLDERSoption plutôt que la SHBrowseForFolderfonction. Cela utilise la boîte de dialogue Ouvrir les fichiers en mode de sélection de dossiers et est l'implémentation préférée."
Herohtar