Bir klasör seçmek için OpenFileDialog nasıl kullanılır?


297

OpenFileDialogKlasörleri seçmek için nasıl kullanılır ?

Aşağıdaki projeyi kullanacaktım: https://github.com/scottwis/OpenFileOrFolderDialog

Ancak bir sorunla karşılaştım. GetOpenFileNameFonksiyonu ve OPENFILENAMEyapıyı kullanır . Ve OPENFILENAMEüye adlı templateID. Diyalog şablonunun tanımlayıcısıdır. Ve proje, res1.rcdosyayı ve şablonlu iletişim kutusunu da içeriyor . Ama bu dosyayı C # projeme nasıl ekleyeceğimi bulamadım.

OpenFileDialogKlasörleri seçmek için bir kullanmanın daha iyi bir yolu var mı ?


Proje dosyasını düzenleyiciyle açarsanız, alt kısımda bazı ek özellikler görürsünüz: <VCIncludePath ...>, <Win32Resource ...> ve <Target Name = "BeforeBuild" ...>. Res1.rc kaynak dosyasını derlemek için rc.exe'yi çalıştırdığını göreceksiniz ("resource.h" dosyasını da projenize kopyaladığınızdan emin olun). VisualC yüklendiğinden ve VCIncludePath'in uygun bir konuma işaret ettiğinden emin olun (github'ın bir tane VC9.0 sürümüne işaret eder ve değiştirmeniz gerekebilir). .Rc dosyasını derledikten sonra, sonuçta ortaya çıkan .res dosyası, Win32Resource yönergesi ile yürütülebilir dosyanızın kaynağı olarak eklenir.
mistika

3
OpenFileDialog kullanan bir hackish çözümü vardır ValidateNamesve CheckFileExistsburada her ikisi de false olarak ayarlanır ve FileNamebir dizinin seçildiğini belirtmek için sahte bir değer verilir. Hack diyorum çünkü kullanıcılara nasıl klasör seçileceği konusunda kafa karıştırıcı. Bkz . Aynı iletişim kutusundan dosya veya klasör seçme
Daniel Ballinger

1
Thanx Dan, OpenFileDialog-Hack'i işaret ettiği için! Bu, FolderBrowserDialog'dan daha iyidir, çünkü OFD yer imi klasörleri vb. Gösterir, bu nedenle herkes - özellikle büyük şirketlerde - boklarını bulur. FBD bu yerlerde pek iyi gitmeyecek.
JayC667

1
@ComradeJoecool Yorumumu bir cevaba dönüştürdüm . Birkaç kez denedim ve "dosya bulunamadı" sorunu yoktu. Aynı OpenFileDialog örneğini yeniden mi kullanıyorsunuz?
Daniel Ballinger

1
Ben, iletişim oluşturmak için PowerShell kullanarak kuruyorum beri ah @DanielBallinger, benim sorunu buldum ValidateNamesve CheckFileExistshiç falseçalışma değildi, ben onları ayarlamak için gerekli 0(veya Powershell daha iyi öğrenmek)
ComradeJoecool

Yanıtlar:


397

Temelde FolderBrowserDialogsınıfa ihtiyacınız var :

Kullanıcıdan bir klasör seçmesini ister. Bu sınıf devralınamaz.

Misal:

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

WPF'de çalışıyorsanız , başvuruyu eklemeniz gerekir System.Windows.Forms.

ders using System.IOiçin de eklemelisinDirectory


186
FolderBrowserDialog'un kullanılabilirliği yoktur. Ana dezavantajı, hızlı gezinme için Windows Gezgini'nden bir klasör yolunu kopyalamanıza izin vermemesidir ve üçten fazla düzeyi ayrıntılı olarak incelemeniz gerektiğinde işe yaramaz hale gelir. Özellikle depolama yavaş olduğunda veya düzeylerden birinde çok sayıda klasörünüz varsa, her bir klasöre delmek istenmez.
mistika

2
Soru özellikle FolderBrowserDialog (FBD) değil, bir klasör seçmek için OpenFileDialog (OFD) kullanmakla ilgilidir. FBD'nin kullanıcı açısından korkunç olduğuna katılıyorum.
Michael Paulukonis

27
Arabirimi bozuk UI olan bu iletişim kutusuna alternatif olarak, bir CommonOpenFileDialog : kullanın new CommonOpenFileDialog { IsFolderPicker = true }.
ANeves

114
Lütfen, hiç kullanma ! Bir kullanıcı olarak bu korkunç ağaç görünümü iletişim kutusu (ki sadece FolderBrowserDialog) ile başka bir uygulama yapan bu kötü programcılar suçluyordu hatırlıyorum . Tamamen kullanılamaz: bir grup kök dizin, eksik bir favori paneli ve en korkunç - oraya bir yol bile yapıştıramazsınız! Ve şimdi bir programcı olarak kullanmak için bir tavsiye görüyorum… Lütfen yapma.
Hi-Angel

2
FolderBrowserDialog, diğer kullanıcıların söylediği her şeyin yanında büyük bir kusura sahiptir. Son seçilen yolu hatırlamıyor!
AleX_

254

Kullanmaktan kaçınmak isteyen gelecekteki kullanıcılar için bir not olarak FolderBrowserDialog, Microsoft bir keresinde WindowsAPICodePack adlı CommonOpenFileDialog, yararlı bir iletişim kutusu olan ve bir IsFolderPickermoda ayarlanabilen bir API yayınladı . API, Microsoft'tan NuGet paketi olarak edinilebilir .

Kurulumu ve kullanımı için gereken tek şey bu CommonOpenFileDialog. (NuGet bağımlılıkları ele aldı)

Install-Package Microsoft.WindowsAPICodePack-Shell

İçerme satırı için:

using Microsoft.WindowsAPICodePack.Dialogs;

Kullanımı:

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

36
Bence bu "Klasör seçmek için OpenFileDialog nasıl kullanılır?" FolderBrowseDialog çok kullanılamaz. Bu cevap için teşekkürler.
Koray

46
Cevap bu olmalı. Bunu kullanabilmeniz için Microsoft.WindowsAPICodePack.Shellpaketi NuGet aracılığıyla kurmanız gerektiğini unutmayın CommonOpenFileDialog.
smwikipedia

1
Bunu VS2017 ile kullanırsanız ana pencerenizi yeniden düzenler.
Lokiare

1
FolderBrowserDialogKullanıcılar için not : birden çok eşzamanlı örnek kullanımı sorun yaratabilir. Bu CommonOpenFileDialogdaha iyi.
Alper

9
Microsoft bunu yeniden yayınlamış gibi görünüyorWindowsAPICodePack-Shell
NucS

32

Orada kullanarak hackish çözümdür OpenFileDialognerede ValidateNamesve CheckFileExistsyanlış olarak hem set edilir ve FileNamebir dizin seçili olduğunu belirten sahte bir değer verilir.

Hack diyorum çünkü kullanıcılara nasıl klasör seçileceği konusunda kafa karıştırıcı. İstenen klasörde olmaları ve dosya adı "Klasör Seçimi" yazarken Aç'a basmanız yeterlidir.

C # Klasör seçimi iletişim kutusu

Bu, Denis Stankovski'nin aynı iletişim kutusundan Dosya veya klasör seç'e dayanır .

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

Anlıyorum, evet işe başladım. Can sıkıcı bir şey, Folder Selection.dosya adının sonuna bu şekilde bağlanacak olmasıdır: C:\Folder Selection.Sanırım bu karakterleri her zaman dizeden kaldırabilirsiniz. Hala FolderBrowserDialog
ComradeJoecool'dan

Bu benim için işe yaramıyor. Klasörleri seçmeme izin vermiyor. Sadece onları açar.
Lokiare

1
@Lokiare Bir kesmek olduğunu söylediğimde bunu kastediyorum. İkinci paragraftaki talimatlara bakın.
Daniel Ballinger

2
@ComradeJoecool bunu manuel olarak kaldırmak zorunda değilsiniz. koddaki son satırın nedeni budur: string folderPath = Path.GetDirectoryName (folderBrowser.FileName);
Heriberto Lugo

Ah! bu yöntemle ilgili bir sorun var: kullanıcı klasörlere göz atarken Yukarı veya Geri düğmelerine basarsa, Openiletişim kutusunun ana düğmesi beklendiği gibi çalışmaz! önceki klasöre geri atlamak neden olur! ancak klasörleri seçmek için çift tıklattığınızda veya her klasörün içindeki bazı dosyaları seçtiğinizde çalışır (seçebileceğiniz herhangi bir dosya varsa)
S.Serpooshan

14

Bu kadar çok cevap / oy garip ama kimse aşağıdaki kodu cevap olarak eklemiyor:

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

9
Cevabınız arasında Ionică Bizau'da @ fark var mıdır Yanıt ?
Chetan Mehra

1
Mantık aynıdır, ancak cevabım çok daha kısadır ve DialogResult için ekstra değişken oluşturmanıza gerek yoktur.
Andrew

2
Daha önce de belirtildiği gibi, bu yöntemle ilgili bazı büyük sorunlar var: bu korkunç bir ağaç görünümü iletişim kutusu! bir yolu kopyalayıp yapıştıramazsınız, kök klasörden tek tek delmeniz gerekir ve sık kullanılanlar paneli yoktur!
S.Serpooshan

@ S.Serpooshan önemli değil. Bu, HERHANGİ BİR iletişim kutusunun kullanımının bir örneğidir. İsterseniz başka bir iletişim kutusu kullanabilirsiniz. :)
Andrew

9

FolderBrowserDialog'dan hemen sonra gibi geliyor bana .


5
Bu b / c (mistika zaten işaret ettiği gibi) downvoted sanırım FolderBrowserDialog korkunç kullanılabilirlik ve OP açıkça OpenFileDialog kullanmak istedim.
mbx

3
@mbx Belki. Adil olmak gerekirse, OP "OpenFileDialog dışında hiçbir şey kullanamıyorum" demiyor. Başlangıçta buna cevap verdiğimde (4 buçuk yıl önce ...), OP'nin bir kullanıcının bir klasörü açmasına nasıl izin vereceğini bilmediği varsayımıydı. Bu soruyu gönderdikten sonra aslında bu soruya dönmedim, bu yüzden kullanılabilirlikle ilgili herhangi bir tartışma görmedim - ya da cevaplarken dikkate almadım.
Simon Whitehead

6

Tüm kaynağı tek, basit bir ZIP dosyasında sunan başka bir çözüm.

OpenFileDialog'a Windows 7+ Klasör Seçimi iletişim kutusu gibi çalışmasını sağlayan ek pencere bayrakları sunar.

Web sitesi başına, kamu malı: "Ne gibi bir kod almak ve yapmak serbesttir gibi lisans yoktur."

Archive.org bağlantıları:


1
Mükemmel çalışın !. Ayrıca "FolderSelectDialog.cs" içine bu satırı ekleyerek birden fazla klasör seçmesini sağlayabilirsiniz: public string [] FileNames {get {return ofd.FileNames; }} ve d.Multiselect = true; yapıcı
Maxter

5

Sırasıyla Windows Forms ve WPF için bir klasör tarayıcı iletişim kutusu uygulaması olan Ookii Dialogs kitaplıklarına bakın .

resim açıklamasını buraya girin

Ookii.Dialogs.WinForms

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


Ookii.Dialogs.Wpf

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


iyi. not: Ookii.Dialogs için Microsoft .NET Framework 4.5 veya üstü gerekir. (
WinXP'de

2
@ S.Serpooshan - Sanırım Windows 3.1 bilgisayarımda da çalışmayacak, değil mi? Ama cidden, 2018'de hiç kimse Windows XP hakkında düşünmemeli - çoktan öldü.
rory.ap

@ rory.ap aslında, bu çözümün ana sorunu benim için klasörlere göz atarken dosyaları göstermemesidir. Kullanıcı klasörü seçmek istediğinde dosyaları (örneğin işlenecek görüntüler) görebilmek bazen çok yararlı olur!
S.Serpooshan

-5

bu en açık ve en açık yol olmalı

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

}

3
FolderBrowserDialogZaten burada birkaç kez teklif edildi ve yanlış cevap. Eski ve kullanıcı dostu olmayan bir arayüz. O kullanır SHBrowseForFolderaltında ve hatta belgeler devlet "Windows Vista için ya da geç, sen kullanmanız önerilir IFileDialogile FOS_PICKFOLDERSyerine seçenek SHBrowseForFolder. İşlevine Bu kullanımlarını seçim klasörleri modunda aç Dosyaları iletişim ve tercih uygulamasıdır."
Herohtar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.