364 votes

Comment utiliser OpenFileDialog pour sélectionner un dossier ?

Mode d'emploi OpenFileDialog pour sélectionner les dossiers ?

J'avais l'intention d'utiliser le projet suivant : https://github.com/scottwis/OpenFileOrFolderDialog

Cependant, j'ai été confronté à un problème. Il utilise le GetOpenFileName et OPENFILENAME structure. Et OPENFILENAME a le membre nommé templateID . C'est l'identifiant du modèle de dialogue. Et le projet contient le res1.rc et l'init de la boîte de dialogue modèle, également. Mais je n'ai pas réussi à trouver comment joindre ce fichier à mon projet C#.

Y a-t-il une meilleure façon d'utiliser un OpenFileDialog pour sélectionner les dossiers ?

0 votes

Si vous ouvrez le fichier du 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 ressource res1.rc (assurez-vous de copier également le fichier "resource.h" dans votre projet). Assurez-vous que vous avez installé VisualC 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é comme ressource pour votre exécutable avec la directive Win32Resource.

3 votes

Il existe une solution bricolée utilisant OpenFileDialog où ValidateNames y CheckFileExists sont tous deux mis à faux et FileName reçoit une valeur fictive pour indiquer qu'un répertoire est sélectionné. Je dis "hack" parce que cela prête à confusion pour les utilisateurs sur la façon de sélectionner un répertoire. Voir Sélectionnez un fichier ou un dossier dans la même boîte de dialogue

0 votes

443voto

Ionică Bizău Points 14484

En gros, vous avez besoin du FolderBrowserDialog classe :

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.IO pour Directory clase

224 votes

Le FolderBrowserDialog manque de convivialité. Son principal inconvénient est qu'il ne permet pas de copier le chemin d'accès d'un dossier depuis l'Explorateur Windows pour une navigation rapide, ce qui le rend inutile lorsque vous devez descendre de plus de trois niveaux. L'exploration de chaque dossier n'est pas souhaitée, surtout lorsque le stockage est lent ou lorsque vous avez beaucoup de dossiers à l'un des niveaux.

10 votes

La question porte spécifiquement sur l'utilisation du OpenFileDialog (OFD) pour sélectionner un dossier, et non du FolderBrowserDialog (FBD). Je suis d'accord pour dire que le FBD est horrible du point de vue de l'utilisateur.

38 votes

Au lieu de cette boîte de dialogue avec une interface utilisateur cassée, utilisez une CommonOpenFileDialog : new CommonOpenFileDialog { IsFolderPicker = true } .

356voto

Joe Points 3545

À l'attention des futurs utilisateurs qui souhaitent éviter d'utiliser l'option FolderBrowserDialog Microsoft a publié une fois une API appelée WindowsAPICodePack qui comportait une boîte de dialogue utile appelée CommonOpenFileDialog qui pourrait être placé dans un IsFolderPicker mode. L'API est disponible auprès de Microsoft en tant que Paquet NuGet .

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

Install-Package Microsoft.WindowsAPICodePack-Shell

Pour la ligne d'inclusion :

using Microsoft.WindowsAPICodePack.Dialogs;

Utilisation :

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
    MessageBox.Show("You selected: " + dialog.FileName);
}

50 votes

Je pense que c'est la réponse la plus proche de "Comment utiliser OpenFileDialog pour sélectionner un dossier ?". FolderBrowseDialog est très peu utilisable. Merci pour cette réponse.

54 votes

Cela devrait être la réponse. Et notez que vous devez installer le Microsoft.WindowsAPICodePack.Shell par l'intermédiaire de NuGet avant de pouvoir utiliser cet outil. CommonOpenFileDialog .

1 votes

Après avoir sélectionné un dossier, la boîte de dialogue se ferme et se débarrasse du "formulaire" si celui-ci est ouvert à partir d'un autre formulaire parent à l'aide de l'outil de gestion des données. showDialog() au lieu de show() j'ai réussi à résoudre le problème en utilisant show() au lieu de show() et en définissant Focus() sur la forme appelante de l'objet commonOpenFileDialog.

45voto

Daniel Ballinger Points 4883

Il existe une solution pirate utilisant OpenFileDialog donde ValidateNames y CheckFileExists sont tous deux mis à faux et FileName reçoit une valeur fictive pour indiquer qu'un répertoire est sélectionné.

Je dis "pirater" parce que cela prête à confusion pour les utilisateurs sur la façon de sélectionner un dossier. Ils doivent se trouver dans le dossier souhaité, puis appuyer sur Ouvrir alors que le nom du fichier indique "Sélection de dossier".

C# Folder selection dialog

Ceci est basé sur Sélectionnez 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);
    // ...
}

0 votes

Je vois, oui j'ai réussi à le faire fonctionner. Une chose ennuyeuse est que Folder Selection. sera ajouté à la fin du nom du fichier comme suit : C:\Folder Selection. Je suppose que vous pouvez toujours supprimer ces caractères de la chaîne. C'est quand même mieux que le FolderBrowserDialog.

0 votes

Ça ne marche pas pour moi. Il ne me permet pas de sélectionner des dossiers. Il ne fait que les ouvrir.

1 votes

@Lokiare C'est ce que je voulais dire quand je disais que c'était un hack. Voir les instructions du deuxième paragraphe.

15voto

Andrew Points 2027

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

using (var opnDlg = new OpenFileDialog()) //ANY dialog
{ 
    //opnDlg.Filter = "Png Files (*.png)|*.png";
    //opnDlg.Filter = "Excel Files (*.xls, *.xlsx)|*.xls;*.xlsx|CSV Files (*.csv)|*.csv"

    if (opnDlg.ShowDialog() == DialogResult.OK)
    {
        //opnDlg.SelectedPath -- your result
    }
}

10 votes

Y a-t-il une différence entre votre réponse et celle de @Ionica Bizau ? Réponse : ?

1 votes

La logique est la même, mais ma réponse est beaucoup plus courte et vous n'avez pas besoin de créer une variable supplémentaire pour DialogResult.

5 votes

Comme nous l'avons déjà mentionné, cette méthode présente de gros problèmes : la boîte de dialogue de l'arborescence est affreuse ! Vous ne pouvez pas y copier-coller un chemin, vous devez percer un par un à partir du dossier Root et il n'y a pas de panneau de favoris !

13voto

Simon Whitehead Points 27669

J'ai l'impression que vous êtes juste après la FolderBrowserDialog .

6 votes

Je suppose que cette question est en train d'être rejetée parce que (comme Mistika l'a déjà souligné) le FolderBrowserDialog est horriblement facile à utiliser et que le PO voulait explicitement utiliser le OpenFileDialog.

3 votes

@mbx Peut-être. Pour être juste, le PO ne dit pas "Je ne peux pas utiliser autre chose que le OpenFileDialog". Lorsque j'ai répondu à cette question à l'origine (il y a plus de 4 ans et demi...), l'hypothèse était que le PO ne savait tout simplement pas comment laisser un utilisateur ouvrir un dossier. Je ne suis pas revenu sur cette question après avoir posté cette réponse et je n'ai donc pas vu la discussion sur l'ergonomie - et je n'en ai pas tenu compte dans ma réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X