Bagaimana cara menggunakan OpenFileDialog untuk memilih folder?

297

Bagaimana cara menggunakan OpenFileDialoguntuk memilih folder?

Saya akan menggunakan proyek berikut: https://github.com/scottwis/OpenFileOrFolderDialog

Namun, saya menghadapi satu masalah. Ia menggunakan GetOpenFileNamefungsi dan OPENFILENAMEstruktur. Dan OPENFILENAMEmemiliki anggota bernama templateID. Ini adalah pengidentifikasi untuk templat dialog. Dan proyek tersebut berisi res1.rcfile dan init templated dialog juga. Tapi saya tidak tahu bagaimana cara melampirkan file ini ke proyek C # saya.

Apakah ada cara yang lebih baik untuk menggunakan OpenFileDialogfolder pilih?

Yun
sumber
Jika Anda membuka file proyek dengan editor, Anda akan melihat beberapa properti tambahan di bagian bawah: <VCIncludePath ...>, <Win32Resource ...> dan <Target Name = "BeforeBuild" ...>. Anda akan melihat bahwa ia menjalankan rc.exe untuk mengkompilasi file sumber daya res1.rc (pastikan untuk menyalin "resource.h" juga ke proyek Anda). Pastikan Anda telah menginstal VisualC dan VCIncludePath menunjuk ke lokasi yang tepat (satu poin github ke versi VC9.0, dan Anda mungkin perlu mengubahnya). Setelah mengkompilasi file .rc, file .res yang dihasilkan ditambahkan sebagai sumber daya untuk dieksekusi Anda dengan direktif Win32Resource.
mistika
3
Ada solusi retas menggunakan OpenFileDialog di mana ValidateNamesdan CheckFileExistskeduanya disetel ke false dan FileNamediberi nilai tiruan untuk menunjukkan bahwa direktori dipilih. Saya katakan retas karena membingungkan bagi pengguna tentang cara memilih folder. Lihat Pilih file atau folder dari dialog yang sama
Daniel Ballinger
1
Thanx Dan untuk menunjuk ke arah OpenFileDialog-Hack! Itu jauh lebih baik daripada FolderBrowserDialog, karena OFD menunjukkan folder yang ditandai dll, sehingga semua orang - terutama di perusahaan yang lebih besar - menemukan omong kosong mereka. FBD tidak akan berbuat banyak baik di tempat-tempat itu.
JayC667
1
@ComradeJoecool Saya telah mengonversi komentar saya menjadi sebuah jawaban . Saya mencobanya beberapa kali dan tidak memiliki masalah "file tidak ditemukan". Apakah Anda menggunakan instance OpenFileDialog yang sama?
Daniel Ballinger
1
@DanielBallinger ah, saya menemukan masalah saya, karena saya menggunakan Powershell untuk membuat dialog, pengaturan ValidateNamesdan CheckFileExistsagar falsetidak berfungsi, saya perlu mengaturnya ke 0(atau belajar PowerShell lebih baik)
ComradeJoecool

Jawaban:

397

Pada dasarnya Anda membutuhkan FolderBrowserDialogkelas:

Meminta pengguna untuk memilih folder. Kelas ini tidak dapat diwarisi.

Contoh:

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

Jika Anda bekerja di WPF Anda harus menambahkan referensi System.Windows.Forms.

Anda juga harus menambahkan using System.IOuntuk Directorykelas

Ionică Bizău
sumber
186
FolderBrowserDialog tidak memiliki kegunaan. Kerugian utama adalah tidak memungkinkan Anda untuk menyalin path folder dari Windows Explorer untuk navigasi cepat, menjadikannya tidak berguna ketika Anda perlu menelusuri lebih dari tiga level. Mengebor ke dalam setiap folder tidak diinginkan terutama ketika penyimpanannya lambat atau ketika Anda memiliki banyak folder di salah satu level.
mistika
2
Pertanyaannya secara khusus tentang menggunakan OpenFileDialog (OFD) untuk memilih folder, bukan FolderBrowserDialog (FBD). Saya setuju bahwa FBD buruk dari sudut pandang pengguna.
Michael Paulukonis
27
Atau untuk dialog ini dengan rusak UI, menggunakan CommonOpenFileDialog : new CommonOpenFileDialog { IsFolderPicker = true }.
ANeves
114
Tolong, jangan pernah menggunakannya ! Saya ingat sebagai pengguna saya menyalahkan pemrogram miskin yang membuat aplikasi lain dengan dialog tampilan pohon yang mengerikan ini (yang hanya FolderBrowserDialog) . Ini benar-benar tidak dapat digunakan: sekelompok dir root, panel favorit hilang, dan yang paling mengerikan - Anda bahkan tidak dapat menempelkan path di sana! Dan sekarang sebagai programmer saya melihat saran untuk menggunakannya ... Tolong, jangan lakukan itu.
Hai Malaikat
2
FolderBrowserDialog memiliki satu kelemahan besar di samping segala sesuatu yang dikatakan pengguna lain. Itu tidak ingat jalan yang dipilih terakhir!
AleX_
254

Sebagai catatan untuk pengguna masa depan yang ingin menghindari penggunaan FolderBrowserDialog, Microsoft pernah merilis API yang disebut WindowsAPICodePack yang memiliki dialog bermanfaat yang disebut CommonOpenFileDialog, yang dapat diatur ke IsFolderPickermode. API tersedia dari Microsoft sebagai paket NuGet .

Ini semua yang saya butuhkan untuk menginstal dan menggunakan CommonOpenFileDialog. (NuGet menangani dependensi)

Install-Package Microsoft.WindowsAPICodePack-Shell

Untuk baris sertakan:

using Microsoft.WindowsAPICodePack.Dialogs;

Pemakaian:

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
    MessageBox.Show("You selected: " + dialog.FileName);
}
Joe
sumber
36
Saya pikir ini adalah jawaban terdekat untuk "Bagaimana cara menggunakan OpenFileDialog untuk memilih folder?" FolderBrowseDialog sangat tidak dapat digunakan. Terima kasih atas jawaban ini.
Koray
46
Ini seharusnya jawabannya. Dan perhatikan bahwa Anda perlu menginstal Microsoft.WindowsAPICodePack.Shellpaket melalui NuGet sebelum Anda dapat menggunakan ini CommonOpenFileDialog.
smwikipedia
1
Jika Anda menggunakan ini dengan VS2017 itu akan mengatur ulang jendela utama Anda.
Lokiare
1
Catatan untuk FolderBrowserDialogpengguna: penggunaan banyak contoh secara bersamaan dapat menimbulkan masalah. Ini CommonOpenFileDialoglebih baik
Alper
9
Microsoft tampaknya telah menerbitkannya kembali sebagaiWindowsAPICodePack-Shell
NucS
32

Ada solusi peretasan menggunakan di OpenFileDialogmana ValidateNamesdan CheckFileExistskeduanya disetel ke false dan FileNamediberi nilai tiruan untuk menunjukkan bahwa direktori dipilih.

Saya katakan retas karena membingungkan bagi pengguna tentang cara memilih folder. Mereka harus berada di folder yang diinginkan dan kemudian cukup tekan Buka sementara nama file mengatakan "Pemilihan Folder."

C # Dialog pemilihan folder

Ini didasarkan pada Pilih file atau folder dari dialog yang sama oleh 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
sumber
Begitu ya, sudah berhasil. Satu hal yang mengganggu adalah bahwa Folder Selection.akan ditempelkan di akhir nama file seperti: C:\Folder Selection.Saya kira Anda selalu dapat menghapus karakter-karakter dari string. Masih terlihat lebih baik daripada FolderBrowserDialog
ComradeJoecool
Ini tidak berhasil untuk saya. Itu tidak akan memungkinkan saya untuk memilih folder. Itu hanya membuka mereka.
Lokiare
1
@Lokiare Itulah yang saya maksud ketika saya mengatakan itu adalah hack. Lihat instruksi dari paragraf kedua.
Daniel Ballinger
2
@ComradeJoecool Anda tidak perlu menghapusnya secara manual. untuk itulah baris terakhir dalam kode: string folderPath = Path.GetDirectoryName (folderBrowser.FileName);
Heriberto Lugo
Oh! ada masalah dengan metode ini: jika pengguna menekan tombol Atas atau Kembali saat menelusuri folder, Opentombol utama dialog tidak berfungsi seperti yang diharapkan! itu menyebabkan Anda melompat kembali ke folder prev! tetapi ini berfungsi ketika Anda cukup mengklik dua kali folder untuk memilihnya atau memilih beberapa file di dalam masing-masing folder (jika ada file yang dapat Anda pilih)
S.Serpooshan
14

Aneh begitu banyak jawaban / suara, tetapi tidak ada yang menambahkan kode berikut sebagai jawaban:

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
sumber
9
Apakah ada perbedaan antara jawaban Anda dan @ Ionică Bizău Answer ?
Chetan Mehra
1
Logikanya sama, tetapi jawaban saya jauh lebih pendek dan Anda tidak perlu membuat variabel tambahan untuk DialogResult.
Andrew
2
Seperti yang telah disebutkan, ada beberapa masalah besar dengan metode ini: ini adalah dialog tampilan pohon yang mengerikan! Anda tidak dapat menyalin-menempelkan path ke sana, Anda harus mengebor satu per satu dari folder root dan tidak ada panel favorit!
S.Serpooshan
@ S.Serpooshan tidak masalah. Ini hanya contoh penggunaan dialog APA SAJA. Anda dapat menggunakan dialog lain apa pun jika Anda mau. :)
Andrew
9

Kedengarannya bagi saya seperti Anda hanya setelah FolderBrowserDialog .

Simon Whitehead
sumber
5
Saya kira ini semakin downvoted b / c (seperti yang ditunjukkan oleh mistika) FolderBrowserDialog memiliki kegunaan yang mengerikan dan OP secara eksplisit ingin menggunakan OpenFileDialog.
mbx
3
@ MBX Mungkin. Agar adil, OP tidak mengatakan "Saya tidak bisa menggunakan apa pun selain OpenFileDialog". Ketika saya awalnya menjawab ini (lebih dari 4 setengah tahun yang lalu ...), asumsinya adalah bahwa OP tidak tahu bagaimana membiarkan pengguna membuka folder. Saya tidak benar-benar kembali ke pertanyaan ini setelah memposting jawaban ini jadi saya belum melihat diskusi tentang kegunaan - saya juga tidak mempertimbangkannya saat menjawab.
Simon Whitehead
6

Berikut adalah solusi lain, yang memiliki semua sumber tersedia dalam satu file ZIP yang sederhana.

Ini menyajikan OpenFileDialog dengan flag windows tambahan yang membuatnya berfungsi seperti dialog Pemilihan Folder Windows 7+.

Per situs web, ini adalah domain publik: "Tidak ada lisensi seperti Anda bebas untuk mengambil dan melakukan dengan kode apa yang Anda inginkan."

Tautan Archive.org:

Ben Keene
sumber
1
Bekerja dengan sempurna !. Anda juga dapat membuatnya memilih beberapa folder dengan menambahkan baris ini di "FolderSelectDialog.cs": public string [] FileNames {get {return ofd.FileNames; }} dan ubah ofd.Multiselect = true; dalam konstruktor
Maxter
5

Lihatlah perpustakaan Dialog Ookii yang masing-masing memiliki implementasi dialog browser folder untuk Windows Forms dan WPF.

masukkan deskripsi gambar di sini

Ookii.Dialogs.WinForms

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


Ookii.Dialogs.Wpf

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

C. Augusto Proiete
sumber
baik. catatan: Ookii.Dialogs membutuhkan Microsoft .NET Framework 4.5 atau lebih tinggi. (tidak dapat digunakan di WinXP)
S.Serpooshan
2
@ S.Serpooshan - Yah saya kira itu tidak akan berfungsi pada PC Windows 3.1 saya juga, kan? Tapi serius, pada 2018, tidak ada yang harus memikirkan Windows XP - sudah lama mati.
rory.ap
@ rory.ap sebenarnya, masalah utama dari solusi ini bagi saya adalah tidak menunjukkan file saat browsing folder. Terkadang sangat berguna untuk dapat melihat file (misalnya gambar yang akan diproses) ketika pengguna ingin memilih folder!
S.Serpooshan
-5

ini harus menjadi cara yang paling jelas dan lurus ke depan

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
sumber
3
FolderBrowserDialogtelah ditawarkan di sini beberapa kali, dan merupakan jawaban yang salah. Ini adalah antarmuka yang usang dan sangat tidak ramah pengguna. Ini menggunakan di SHBrowseForFolderbawahnya, dan bahkan status dokumen "Untuk Windows Vista atau yang lebih baru, disarankan agar Anda menggunakan IFileDialogdengan FOS_PICKFOLDERSopsi daripada SHBrowseForFolderfungsi. Ini menggunakan dialog Open Files dalam mode memilih folder dan merupakan implementasi yang disukai."
Herohtar