Wie verwende ich OpenFileDialog, um einen Ordner auszuwählen?

296

Wie verwende OpenFileDialogich Ordner?

Ich wollte das folgende Projekt verwenden: https://github.com/scottwis/OpenFileOrFolderDialog

Ich hatte jedoch ein Problem. Es nutzt die GetOpenFileNameFunktion und OPENFILENAMEStruktur. Und OPENFILENAMEhat das Mitglied benannt templateID. Es ist die Kennung für die Dialogvorlage. Das Projekt enthält auch die res1.rcDatei und den Initial-Dialog. Ich konnte jedoch nicht herausfinden, wie ich diese Datei an mein C # -Projekt anhängen kann.

Gibt es eine bessere Möglichkeit OpenFileDialog, Ordner auszuwählen?

Yun
quelle
Wenn Sie die Projektdatei mit dem Editor öffnen, werden Sie unten einige zusätzliche Eigenschaften bemerken: <VCIncludePath ...>, <Win32Resource ...> und <Target Name = "BeforeBuild" ...>. Sie werden sehen, dass rc.exe ausgeführt wird, um die Ressourcendatei res1.rc zu kompilieren (kopieren Sie auch die Datei "resource.h" in Ihr Projekt). Stellen Sie sicher, dass Sie VisualC installiert haben und dass VCIncludePath auf einen geeigneten Speicherort verweist (Githubs zeigt auf die VC9.0-Version, und Sie müssen ihn möglicherweise ändern). Nach dem Kompilieren der RC-Datei wird die resultierende RES-Datei als Ressource für Ihre ausführbare Datei mit der Win32Resource-Direktive hinzugefügt.
Mistika
3
Es gibt eine hackish Lösung Openfiledialog mit dem ValidateNamesund CheckFileExistsbeide auf falsch sind und FileNameist ein Mock - Wert gegeben , um anzuzeigen , dass ein Verzeichnis ausgewählt ist. Ich sage Hack, weil es für Benutzer verwirrend ist, wie man einen Ordner auswählt. Siehe Datei oder Ordner aus demselben Dialogfeld auswählen
Daniel Ballinger
1
Danke Dan für den Hinweis auf den OpenFileDialog-Hack! Das ist viel besser als FolderBrowserDialog, da OFD mit Lesezeichen versehene Ordner usw. anzeigt, sodass jeder - insbesondere in größeren Unternehmen - seinen Mist findet. FBD wird an diesen Orten nicht viel Gutes tun.
JayC667
1
@ComradeJoecool Ich habe meinen Kommentar in eine Antwort umgewandelt . Ich habe es mehrmals versucht und hatte kein Problem mit "Datei nicht gefunden". Verwenden Sie dieselbe OpenFileDialog-Instanz erneut?
Daniel Ballinger
1
@DanielBallinger ah, ich mein Problem gefunden, da ich Powershell bin mit dem Dialog zu erstellen, Einstellung ValidateNamesund CheckFileExistszu falsefunktionierte nicht, ich brauchte sie zu setzen 0(oder lernen Powershell besser)
ComradeJoecool

Antworten:

398

Grundsätzlich brauchen Sie die FolderBrowserDialogKlasse:

Fordert den Benutzer auf, einen Ordner auszuwählen. Diese Klasse kann nicht vererbt werden.

Beispiel:

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

Wenn Sie in WPF arbeiten , müssen Sie den Verweis auf hinzufügen System.Windows.Forms.

Sie müssen auch using System.IOfür die DirectoryKlasse hinzufügen

Ionică Bizău
quelle
185
FolderBrowserDialog ist nicht benutzerfreundlich. Der Hauptnachteil besteht darin, dass Sie keinen Ordnerpfad aus dem Windows Explorer für eine schnelle Navigation kopieren können, was ihn unbrauchbar macht, wenn Sie mehr als drei Ebenen aufschlüsseln müssen. Das Bohren in jeden Ordner ist nicht erwünscht, insbesondere wenn der Speicher langsam ist oder wenn Sie viele Ordner auf einer der Ebenen haben.
Mistika
2
Die Frage bezieht sich speziell auf die Verwendung des OpenFileDialog (OFD) zur Auswahl eines Ordners, nicht des FolderBrowserDialog (FBD). Ich stimme zu, dass die FBS vom Standpunkt des Benutzers aus schrecklich ist.
Michael Paulukonis
26
Verwenden Sie alternativ zu diesem Dialogfeld mit defekter Benutzeroberfläche einen CommonOpenFileDialog : new CommonOpenFileDialog { IsFolderPicker = true }.
ANeves
113
Bitte benutzen Sie es niemals ! Ich erinnere mich, dass ich als Benutzer diesen armen Programmierern die Schuld gab, die mit diesem schrecklichen Baumansichtsdialog (der nur der FolderBrowserDialog ist) eine weitere App erstellt haben . Es ist völlig unbrauchbar: eine Reihe von Root-Verzeichnissen, ein fehlendes Favoriten-Panel und das Schrecklichste - Sie können dort nicht einmal einen Pfad einfügen! Und jetzt sehe ich als Programmierer einen Rat, es zu benutzen ... Bitte, tu es nicht.
Hi-Angel
2
FolderBrowserDialog hat neben allem anderen, was die anderen Benutzer gesagt haben, einen großen Fehler. Der letzte ausgewählte Pfad wird nicht gespeichert!
AleX_
253

Als Hinweis für zukünftige Benutzer, die die Verwendung vermeiden möchten FolderBrowserDialog, hat Microsoft einmal eine API namens WindowsAPICodePack veröffentlicht, die einen hilfreichen Dialog namens CommonOpenFileDialoghat, der in einen IsFolderPickerModus versetzt werden kann. Die API ist von Microsoft als NuGet-Paket erhältlich .

Dies ist alles, was ich brauchte, um das zu installieren und zu verwenden CommonOpenFileDialog. (NuGet hat die Abhängigkeiten behandelt)

Install-Package Microsoft.WindowsAPICodePack-Shell

Für die Include-Zeile:

using Microsoft.WindowsAPICodePack.Dialogs;

Verwendungszweck:

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
    MessageBox.Show("You selected: " + dialog.FileName);
}
Joe
quelle
36
Ich denke, dies ist die nächste Antwort auf "Wie verwende ich OpenFileDialog, um einen Ordner auszuwählen?" FolderBrowseDialog ist sehr unbrauchbar. Vielen Dank für diese Antwort.
Koray
46
Dies sollte die Antwort sein. Beachten Sie, dass Sie das Microsoft.WindowsAPICodePack.ShellPaket über NuGet installieren müssen, bevor Sie es verwenden können CommonOpenFileDialog.
smwikipedia
1
Wenn Sie dies mit VS2017 verwenden, wird Ihr Hauptfenster neu formatiert.
Lokiare
1
Hinweis für FolderBrowserDialogBenutzer: Die gleichzeitige Verwendung mehrerer Instanzen kann zu Problemen führen. Das CommonOpenFileDialogist besser.
Alper
9
Microsoft scheint es erneut veröffentlicht zu haben alsWindowsAPICodePack-Shell
NucS
32

Es gibt eine hackige Lösung, bei der OpenFileDialogwhere ValidateNamesund CheckFileExistsbeide auf false und gesetzt sindFileName die einen Scheinwert erhalten, um anzuzeigen, dass ein Verzeichnis ausgewählt ist.

Ich sage Hack, weil es für Benutzer verwirrend ist, wie man einen Ordner auswählt. Sie müssen sich im gewünschten Ordner befinden und dann einfach auf Öffnen klicken, während der Dateiname "Ordnerauswahl" lautet.

C # Ordnerauswahldialog

Dies basiert auf Datei oder Ordner im selben Dialogfeld von Denis Stankovski auswählen.

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
quelle
Ich verstehe, ja, ich habe es zum Laufen gebracht. Eine nervige Sache ist, dass sie wie Folder Selection.folgt am Ende des Dateinamens angeheftet wird: C:\Folder Selection.Ich denke, Sie könnten diese Zeichen immer aus der Zeichenfolge entfernen. Sieht immer noch besser aus als der FolderBrowserDialog
ComradeJoecool
Das funktioniert bei mir nicht. Ich kann keine Ordner auswählen. Es öffnet sie nur.
Lokiare
1
@Lokiare Das habe ich gemeint, als ich sagte, es sei ein Hack. Siehe die Anweisungen aus dem zweiten Absatz.
Daniel Ballinger
2
@ComradeJoecool Sie müssen das nicht manuell entfernen. Dafür steht die letzte Zeile im Code: string folderPath = Path.GetDirectoryName (folderBrowser.FileName);
Heriberto Lugo
Oh! Bei dieser Methode tritt ein Problem auf: Wenn der Benutzer beim Durchsuchen der Ordner die Schaltflächen Nach oben oder ZurückOpen drückt, funktioniert die Hauptschaltfläche des Dialogfelds nicht wie erwartet! es führt dazu, dass Sie zurück zum vorherigen Ordner springen! aber es funktioniert, wenn Sie nur auf Ordner doppelklicken, um sie auszuwählen, oder einige Dateien in jedem Ordner auswählen (wenn es eine Datei gibt, die Sie auswählen können)
S.Serpooshan
14

Seltsam, dass so viele Antworten / Stimmen, aber niemand den folgenden Code als Antwort hinzufügt:

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
quelle
9
Gibt es einen Unterschied zwischen Ihrer Antwort und @ Ionică Bizau Antwort ?
Chetan Mehra
1
Die Logik ist dieselbe, aber meine Antwort ist viel kürzer und Sie müssen keine zusätzliche Variable für DialogResult erstellen.
Andrew
2
Wie bereits erwähnt, gibt es bei dieser Methode einige große Probleme: Dies ist ein schrecklicher Dialog zur Baumansicht! Sie können keinen Pfad kopieren und einfügen, Sie müssen einen nach dem anderen aus dem Stammordner bohren und es gibt kein Favoritenfenster!
Serpooshan
@ S.Serpooshan ist mir egal. Dies ist nur ein Beispiel für die Verwendung eines beliebigen Dialogfelds. Sie können jeden anderen Dialog verwenden, wenn Sie möchten. :)
Andrew
9

Klingt für mich so, als wären Sie direkt hinter dem FolderBrowserDialog .

Simon Whitehead
quelle
5
Ich denke, dies wird b / c herabgestuft (wie Mistika bereits betont hat). Der FolderBrowserDialog hat eine schreckliche Benutzerfreundlichkeit und OP wollte ausdrücklich den OpenFileDialog verwenden.
mbx
3
@mbx Vielleicht. Um fair zu sein, sagt das OP nicht "Ich kann nichts anderes als den OpenFileDialog verwenden". Als ich dies ursprünglich beantwortete (vor über viereinhalb Jahren ...), war die Annahme, dass das OP einfach nicht wusste, wie ein Benutzer einen Ordner öffnen sollte. Ich bin nach dem Posten dieser Antwort nicht auf diese Frage zurückgekommen, daher habe ich keine Diskussion über Benutzerfreundlichkeit gesehen - noch habe ich sie bei der Beantwortung berücksichtigt.
Simon Whitehead
6

Hier ist eine andere Lösung, bei der alle Quellen in einer einzigen, einfachen ZIP-Datei verfügbar sind.

Der OpenFileDialog wird mit zusätzlichen Windows-Flags dargestellt, sodass er wie das Windows 7+ -Dialogfeld zur Ordnerauswahl funktioniert.

Laut der Website ist es gemeinfrei: "Es gibt keine Lizenz als solche, die Sie frei nehmen und mit dem Code machen können, was Sie wollen."

Archive.org Links:

Ben Keene
quelle
1
Perfekt arbeiten!. Sie können auch mehrere Ordner auswählen, indem Sie diese Zeile in "FolderSelectDialog.cs" hinzufügen: public string [] FileNames {get {return ofd.FileNames; }} und change ofd.Multiselect = true; im Konstruktor
Maxter
5

Schauen Sie sich die Ookii Dialogs- Bibliotheken an, in denen ein Ordner-Browser-Dialog für Windows Forms bzw. WPF implementiert ist.

Geben Sie hier die Bildbeschreibung ein

Ookii.Dialogs.WinForms

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


Ookii.Dialogs.Wpf

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

C. Augusto Proiete
quelle
gut. Hinweis: Für Ookii.Dialogs ist Microsoft .NET Framework 4.5 oder höher erforderlich. (kann nicht in
WinXP
2
@ S.Serpooshan - Nun, ich denke, es wird auch auf meinem Windows 3.1-PC nicht funktionieren, oder? Aber im Ernst, im Jahr 2018 sollte sowieso niemand an Windows XP denken - es ist längst tot.
rory.ap
@ rory.ap Eigentlich ist das Hauptproblem dieser Lösung für mich, dass die Dateien beim Suchen nach Ordnern nicht angezeigt werden. Es ist manchmal sehr nützlich, die Dateien (z. B. zu verarbeitende Bilder) sehen zu können, wenn der Benutzer den Ordner auswählen möchte!
Serpooshan
-5

Dies sollte der naheliegendste und direkteste Weg sein

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
quelle
3
FolderBrowserDialogwurde hier schon mehrfach angeboten und ist die falsche Antwort. Es ist eine veraltete und sehr nicht benutzerfreundliche Oberfläche. Es wird SHBrowseForFolderdarunter verwendet und sogar in den Dokumenten heißt es: "Für Windows Vista oder höher wird empfohlen, dass Sie IFileDialogdie FOS_PICKFOLDERSOption anstelle der SHBrowseForFolderFunktion verwenden. Dies verwendet das Dialogfeld" Dateien öffnen "im Modus" Ordner auswählen "und ist die bevorzugte Implementierung."
Herohtar