web-dev-qa-db-fra.com

Comment utiliser OpenFileDialog pour sélectionner un dossier?

Comment utiliser OpenFileDialog pour 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 fonction GetOpenFileName et la structure OPENFILENAME. Et OPENFILENAME a le membre nommé templateID. C'est l'identifiant du modèle de dialogue. Et le projet contient également le fichier res1.rc et l'init de dialogue basé sur un modèle. Mais je ne savais pas comment joindre ce fichier à mon projet C #.

Existe-t-il un meilleur moyen d’utiliser une variable OpenFileDialog pour sélectionner des dossiers?

207
Yun

En gros, vous avez besoin de la classe FolderBrowserDialog:

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 la classe Directory

331
Ionică Bizău

À l’intention des futurs utilisateurs souhaitant éviter d’utiliser FolderBrowserDialog, Microsoft publiait une API appelée WindowsAPICodePack, dotée d’une boîte de dialogue utile appelée CommonOpenFileDialog, pouvant être définie en mode IsFolderPicker.

Si vous avez accès aux packages de nuget, il est toujours disponible dans les listes publiques sous la forme WindowsAPICodePack

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

AVIS: Le package Microsoft Nuget officiel est disponible dès maintenant

  • Microsoft.WindowsICodePack-Core
  • Microsoft.WindowsICodePack-Shell

chaque paquet est par Microsoft et installera les deux.
URL du projet: http://code.msdn.Microsoft.com/WindowsAPICodePack .

L'utilisateur NuGet aybe a téléchargé une série de paquets non officiels. La plupart des gens semblent lui faire confiance en tant que source fiable.

C’est tout ce que j’avais besoin d’installer pour utiliser la CommonOpenFileDialog. (Nuget a géré les dépendances)

Install-Package WindowsAPICodePack-Shell
146
Joe

É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
    }
}
21
Andrew

Il existe une solution bidon utilisant OpenFileDialogValidateNames et CheckFileExists sont tous deux définis sur false et que FileName reçoit une valeur fictive pour indiquer qu'un répertoire est sélectionné. 

Je dis hack parce que les utilisateurs ne savent pas comment sélectionner un dossier. Ils doivent se trouver dans le dossier souhaité, puis appuyer sur Ouvrir pendant que le nom du fichier indique "Sélection du 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);
    // ...
}
15
Daniel Ballinger

Il me semble que vous êtes juste après le FolderBrowserDialog .

14
Simon Whitehead

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

Il présente OpenFileDialog avec des indicateurs Windows supplémentaires lui permettant de fonctionner comme dans la boîte de dialogue Sélection de dossiers de Windows 7+. 

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

Liens Archive.org:

1
Ben Keene

Examinez les bibliothèques Ookii Dialogs qui implémentent respectivement la boîte de dialogue du navigateur de dossiers pour Windows Forms et WPF.

 enter image description here

Ookii.Dialogs.WinForms

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


Ookii.Dialogs.Wpf

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

0
Caio Proiete