Jak korzystać z OpenFileDialog, aby wybrać folder?

296

Jak używać OpenFileDialogdo wybierania folderów?

Zamierzałem użyć następującego projektu: https://github.com/scottwis/OpenFileOrFolderDialog

Jednak napotkałem jeden problem. Wykorzystuje GetOpenFileNamefunkcję i OPENFILENAMEstrukturę. I OPENFILENAMEma członka o nazwie templateID. Jest to identyfikator szablonu okna dialogowego. Projekt zawiera również res1.rcplik i szablon inicjujący okno dialogowe. Ale nie mogłem wymyślić, jak załączyć ten plik do mojego projektu w języku C #.

Czy istnieje lepszy sposób na użycie OpenFileDialogfolderów do wybrania folderów?

Yun
źródło
Jeśli otworzysz plik projektu za pomocą edytora, na dole zauważysz dodatkowe właściwości: <VCIncludePath ...>, <Win32Resource ...> i <Target Name = "BeforeBuild" ...>. Zobaczysz, że uruchamia się program rc.exe, aby skompilować plik zasobów res1.rc (pamiętaj, aby skopiować również plik „resource.h” do projektu). Upewnij się, że masz zainstalowany VisualC i że VCIncludePath wskazuje właściwą lokalizację (github wskazuje na wersję VC9.0 i być może trzeba ją zmienić). Po skompilowaniu pliku .rc wynikowy plik .res jest dodawany jako zasób pliku wykonywalnego zgodnie z dyrektywą Win32Resource.
mistika
3
Istnieje hackish rozwiązanie wykorzystujące OpenFileDialog, gdzie ValidateNamesi CheckFileExistsoba są ustawione na false i FileNameotrzymuje próbną wartość wskazującą, że katalog jest wybrany. Mówię hack, ponieważ jest mylące dla użytkowników na temat wyboru folderu. Zobacz Wybierz plik lub folder z tego samego okna dialogowego
Daniel Ballinger
1
Thanx Dan za wskazanie w kierunku OpenFileDialog-Hack! Jest to o wiele lepsze niż FolderBrowserDialog, ponieważ OFD pokazuje foldery z zakładkami itp., Więc wszyscy - szczególnie w większych firmach - znajdują swoje badziewie. FBD nie zrobi wiele dobrego w tych miejscach.
JayC667,
1
@ComradeJoecool Przekształciłem swój komentarz na odpowiedź . Próbowałem kilka razy i nie miałem problemu z „nie znaleziono pliku”. Czy ponownie używasz tej samej instancji OpenFileDialog?
Daniel Ballinger
1
@DanielBallinger ah, znalazłem mój problem, ponieważ używam PowerShell utworzyć okno, ustawienie ValidateNamesi CheckFileExistsaby falsenie działał, musiałem ustawić je 0(lub dowiedzieć się PowerShell lepiej)
ComradeJoecool

Odpowiedzi:

397

Zasadniczo potrzebujesz FolderBrowserDialogklasy:

Monituje użytkownika o wybranie folderu. Ta klasa nie może być dziedziczona.

Przykład:

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

Jeśli pracujesz w WPF , musisz dodać odniesienie do System.Windows.Forms.

musisz także dodać using System.IOdo Directoryzajęć

Ionică Bizău
źródło
184
FolderBrowserDialog nie ma użyteczności. Główną wadą jest to, że nie pozwala na skopiowanie ścieżki folderu z Eksploratora Windows w celu szybkiej nawigacji, co czyni go bezużytecznym, gdy trzeba drążyć więcej niż trzy poziomy. Wiercenie w każdym folderze nie jest pożądane, szczególnie gdy pamięć jest wolna lub gdy masz wiele folderów na jednym z poziomów.
mistika
2
Pytanie dotyczy konkretnie użycia OpenFileDialog (OFD) do wybrania folderu, a nie FolderBrowserDialog (FBD). Zgadzam się, że FBD jest okropny z punktu widzenia użytkownika.
Michael Paulukonis
25
Alternatywnie do tego okna dialogowego z połamanymi UI, użyj CommonOpenFileDialog : new CommonOpenFileDialog { IsFolderPicker = true }.
ANeves
113
Proszę, nigdy tego nie używaj ! Pamiętam, że jako użytkownik obwiniałem tych biednych programistów, którzy stworzyli kolejną aplikację z tym okropnym oknem widoku drzewa (którym jest po prostu FolderBrowserDialog) . Jest to całkowicie bezużyteczne: kilka katalogów root, brakujący panel ulubionych i najstraszniejsze - nie można tam nawet wkleić ścieżki! A teraz jako programista widzę radę, aby z niego korzystać… Proszę, nie rób tego.
Cześć Anioł,
2
FolderBrowserDialog ma jedną wielką wadę poza wszystkim innym, co powiedzieli inni użytkownicy. Nie pamięta ostatnio wybranej ścieżki!
AleX_
252

Uwaga dla przyszłych użytkowników, którzy chcieliby uniknąć używania FolderBrowserDialog, Microsoft wydała kiedyś interfejs API o nazwie WindowsAPICodePack, który miał pomocne okno dialogowe o nazwie CommonOpenFileDialog, które można ustawić w IsFolderPickertryb. Interfejs API jest dostępny w firmie Microsoft jako pakiet NuGet .

To wszystko, czego potrzebowałem, aby zainstalować i korzystać z CommonOpenFileDialog. (NuGet obsługiwał zależności)

Install-Package Microsoft.WindowsAPICodePack-Shell

Dla linii dołączania:

using Microsoft.WindowsAPICodePack.Dialogs;

Stosowanie:

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
    MessageBox.Show("You selected: " + dialog.FileName);
}
Joe
źródło
36
Myślę, że jest to najbliższa odpowiedź na pytanie „Jak użyć OpenFileDialog do wybrania folderu?” FolderBrowseDialog jest bardzo bezużyteczny. Dziękuję za tę odpowiedź.
Koray
46
To powinna być odpowiedź. I pamiętaj, że musisz zainstalować Microsoft.WindowsAPICodePack.Shellpakiet za pośrednictwem NuGet, zanim będziesz mógł z niego korzystać CommonOpenFileDialog.
smwikipedia,
1
Jeśli użyjesz tego z VS2017, zmienisz styl głównego okna.
Lokiare,
1
Uwaga dla FolderBrowserDialogużytkowników: wielokrotne korzystanie z niej może powodować problemy. Tak CommonOpenFileDialogjest lepiej
Alper
9
Wydaje się, że Microsoft opublikował go ponownie jakoWindowsAPICodePack-Shell
NucS
32

Istnieje hackish rozwiązanie, w OpenFileDialogktórym gdzie ValidateNamesi CheckFileExistsoba są ustawione na fałsz i FileNameotrzymuje próbną wartość wskazującą, że wybrany jest katalog.

Mówię hack, ponieważ jest mylące dla użytkowników na temat wyboru folderu. Muszą znajdować się w wybranym folderze, a następnie po prostu naciśnij Otwórz, podczas gdy nazwa pliku mówi „Wybór folderu”.

C # Okno dialogowe wyboru folderu

Jest to oparte na pliku Select lub folderze z tego samego okna dialogowego autorstwa Denisa Stankovskiego.

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
źródło
Rozumiem, tak, udało mi się. Jedną z irytujących rzeczy jest to, że Folder Selection.zostaną umieszczone na końcu nazwy pliku w następujący sposób: C:\Folder Selection.Myślę, że zawsze można usunąć te znaki z ciągu. Nadal wygląda lepiej niż FolderBrowserDialog
ComradeJoecool
To mi nie działa. Nie pozwoli mi wybierać folderów. Po prostu je otwiera.
Lokiare,
1
@Lokiare To właśnie miałem na myśli, mówiąc, że to hack. Zobacz instrukcje z drugiego akapitu.
Daniel Ballinger
2
@ComradeJoecool nie musisz ręcznie tego usuwać ręcznie. to jest ostatni wiersz w kodzie: ciąg folderPath = Path.GetDirectoryName (folderBrowser.FileName);
Heriberto Lugo
O! jest problem z tą metodą: jeśli użytkownik naciśnie przyciski W górę lub Wstecz podczas przeglądania folderów, główny Openprzycisk okna dialogowego nie działa zgodnie z oczekiwaniami! powoduje to powrót do poprzedniego folderu! ale działa to po dwukrotnym kliknięciu folderów, aby je zaznaczyć lub wybrać niektóre pliki w każdym folderze (jeśli jest jakiś plik, który można wybrać)
S.Serpooshan
14

Dziwne, że tyle odpowiedzi / głosów, ale nikt nie dodaje następującego kodu jako odpowiedzi:

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
    }
}
Andrzej
źródło
9
Czy jest jakaś różnica między twoją odpowiedzią a @ Ionică Bizău Answer ?
Chetan Mehra
1
Logika jest taka sama, ale moja odpowiedź jest znacznie krótsza i nie trzeba tworzyć dodatkowej zmiennej dla DialogResult.
Andrew
2
Jak już wspomniano, istnieją duże problemy z tą metodą: jest to okropne okno dialogowe widoku drzewa! nie możesz skopiować i wkleić do niej ścieżki, musisz wywiercić jeden po drugim z folderu głównego i nie ma panelu ulubionych!
S.Serpooshan
@ S.Serpooshan i'ts nie ma znaczenia. To tylko przykład użycia DOWOLNEGO okna dialogowego. Możesz użyć dowolnego innego okna dialogowego, jeśli chcesz. :)
Andrew
9

Brzmi dla mnie tak, jakbyś zaraz po FolderBrowserDialog .

Simon Whitehead
źródło
5
Wydaje mi się, że jest to zaniżone b / c (jak już zauważyła mistika) FolderBrowserDialog ma straszliwą użyteczność i OP wyraźnie chciał użyć OpenFileDialog.
mbx,
3
@mbx Być może. Aby być uczciwym, OP nie mówi „Nie mogę używać niczego poza OpenFileDialog”. Kiedy pierwotnie odpowiedziałem na to (ponad 4 i pół roku temu ...), założyłem, że OP po prostu nie wiedział, jak pozwolić użytkownikowi otworzyć folder. Właściwie nie wróciłem do tego pytania po opublikowaniu tej odpowiedzi, więc nie widziałem żadnej dyskusji wokół użyteczności - ani nie brałem tego pod uwagę, odpowiadając.
Simon Whitehead,
6

Oto inne rozwiązanie, które ma wszystkie źródła dostępne w jednym, prostym pliku ZIP.

Przedstawia OpenFileDialog z dodatkowymi flagami systemu Windows, dzięki czemu działa jak okno dialogowe Wybór folderu systemu Windows 7+.

Według strony internetowej jest to domena publiczna: „Nie ma licencji jako takiej, którą możesz pobrać i zrobić z tym, co chcesz”.

Linki do Archive.org:

Ben Keene
źródło
1
Działa idealnie! Możesz także sprawić, by wybrał wiele folderów, dodając ten wiersz w „FolderSelectDialog.cs”: public string [] FileNames {get {return ofd.FileNames; }} i zmień of.Multiselect = true; w konstruktorze
Maxter
5

Spójrz na biblioteki Ookii Dialogs, które mają implementację okna dialogowego przeglądarki folderów odpowiednio dla Windows Forms i WPF.

wprowadź opis zdjęcia tutaj

Ookii.Dialogs.WinForms

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


Ookii.Dialogs.Wpf

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

C. Augusto Proiete
źródło
dobrze. Uwaga: Ookii.Dialogs wymaga Microsoft .NET Framework 4.5 lub nowszej wersji. (nie można używać w WinXP)
S.Serpooshan
2
@ S.Serpooshan - Cóż, myślę, że to też nie będzie działać na moim komputerze z systemem Windows 3.1, prawda? Ale poważnie, w 2018 roku nikt nie powinien myśleć o Windows XP - już dawno nie żyje.
rory.ap
@ rory.ap faktycznie, głównym problemem tego rozwiązania jest dla mnie to, że nie wyświetla plików podczas przeglądania folderów. Czasami bardzo przydatne jest wyświetlanie plików (np. Obrazów do przetworzenia), gdy użytkownik chce wybrać folder!
S.Serpooshan
-5

powinien to być najbardziej oczywisty i bezpośredni sposób

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
źródło
3
FolderBrowserDialogbył już tutaj oferowany wiele razy i jest złą odpowiedzią. Jest to przestarzały i bardzo nieprzyjazny interfejs użytkownika. Używa SHBrowseForFolderpod spodem, a nawet dokumenty mówią: „W systemie Windows Vista lub nowszym zaleca się korzystanie IFileDialogz tej FOS_PICKFOLDERSopcji zamiast z SHBrowseForFolderfunkcją. Używa ona okna dialogowego Otwórz pliki w trybie wyboru folderów i jest preferowaną implementacją”.
Herohtar