किसी फ़ोल्डर का चयन करने के लिए OpenFileDialog का उपयोग कैसे करें?


296

OpenFileDialogफ़ोल्डर्स का चयन करने के लिए कैसे उपयोग करें?

मैं निम्नलिखित परियोजना का उपयोग करने जा रहा था: https://github.com/scottwis/OpenFileOrFolderDialog

हालाँकि, मुझे एक समस्या का सामना करना पड़ा। यह GetOpenFileNameफ़ंक्शन और OPENFILENAMEसंरचना का उपयोग करता है । और OPENFILENAMEनामित सदस्य है templateID। यह संवाद टेम्पलेट के लिए पहचानकर्ता है। और इस परियोजना में res1.rcफ़ाइल और टेम्प्लेटेड डायलॉग इनिट भी शामिल है। लेकिन मैं यह पता नहीं लगा सका कि इस फ़ाइल को अपने C # प्रोजेक्ट में कैसे संलग्न किया जाए।

क्या OpenFileDialogफ़ोल्डर्स का चयन करने के लिए एक बेहतर तरीका है ?


यदि आप संपादक के साथ प्रोजेक्ट फ़ाइल खोलते हैं, तो आपको नीचे कुछ अतिरिक्त गुण दिखाई देंगे: <VCIncludePath ...>, <Win32Resource ...> और <लक्ष्य नाम = "पहले वाला" ...>। आप देखेंगे कि यह संसाधन फ़ाइल res1.rc को संकलित करने के लिए rc.exe चलाता है (अपनी परियोजना में "resource.h" की प्रतिलिपि भी सुनिश्चित करें)। सुनिश्चित करें कि आपने VisualC स्थापित किया है और जो VCIncludePath को एक उचित स्थान पर इंगित करता है (Github के VC9.0 संस्करण में एक अंक, और आपको इसे बदलने की आवश्यकता हो सकती है)। संकलन करने के बाद .rc फ़ाइल, जिसके परिणामस्वरूप .res फ़ाइल Win32Resource निर्देश के साथ आपके निष्पादन योग्य के लिए संसाधन के रूप में जोड़ी जाती है।
मिचिका

3
वहाँ एक hackish OpenFileDialog जहां का उपयोग कर समाधान है ValidateNamesऔर CheckFileExistsगलत पर दोनों सेट कर रहे हैं और FileNameसंकेत मिलता है कि एक निर्देशिका का चयन किया गया एक नकली मूल्य दिया जाता है। मैं कहता हूं कि हैक करें क्योंकि यह उपयोगकर्ताओं को एक फ़ोल्डर का चयन करने के तरीके के बारे में भ्रमित कर रहा है। देखें फ़ाइल या फ़ोल्डर चुनने एक ही संवाद से
डैनियल Ballinger

1
OpenFileDialog-Hack की ओर इशारा करने के लिए Thanx Dan! यह FolderBrowserDialog की तुलना में बेहतर है, क्योंकि OFD बुकमार्क किए गए फ़ोल्डरों आदि को दिखाता है, इसलिए हर कोई - विशेष रूप से बड़ी कंपनियों में - अपनी बकवास पाता है। FBD उन जगहों पर बहुत अच्छा नहीं करेगा।
JayC667

1
@ComradeJoecool मैंने अपनी टिप्पणी को एक उत्तर में बदल दिया है । मैंने इसे कई बार आज़माया और "फ़ाइल नहीं मिली" समस्या थी। क्या आप उसी OpenFileDialog उदाहरण का पुन: उपयोग कर रहे हैं?
डैनियल बॉलिंगर

1
@DanielBallinger आह, मैं अपने मुद्दे को मिल गया है, के बाद से मैं संवाद बनाने के लिए Powershell उपयोग कर रहा हूँ, की स्थापना ValidateNamesऔर CheckFileExistsके लिए falseकाम नहीं कर रहा था, मैं करने के लिए उन्हें सेट करने के लिए आवश्यक 0(या powershell बेहतर सीखते हैं)
ComradeJoecool

जवाबों:


397

मूल रूप से आपको FolderBrowserDialogवर्ग की आवश्यकता है :

उपयोगकर्ता को एक फ़ोल्डर का चयन करने का संकेत देता है। इस वर्ग को विरासत नहीं बनाया जा सकता।

उदाहरण:

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 में काम करते हैं तो आपको संदर्भ जोड़ना होगा System.Windows.Forms

आपको क्लास के using System.IOलिए भी जोड़ना होगाDirectory


184
FolderBrowserDialog में प्रयोज्य का अभाव है। मुख्य नुकसान यह है कि यह आपको त्वरित नेविगेशन के लिए विंडोज एक्सप्लोरर से एक फ़ोल्डर पथ को कॉपी करने की अनुमति नहीं देता है, जब आपको तीन से अधिक स्तरों को ड्रिल करने की आवश्यकता होती है, तो यह बेकार हो जाता है। प्रत्येक फ़ोल्डर में ड्रिलिंग विशेष रूप से वांछित नहीं होती है जब भंडारण धीमा होता है या जब आपके पास एक स्तर पर बहुत सारे फ़ोल्डर होते हैं।
मिस्टिका

2
प्रश्न विशेष रूप से एक फ़ोल्डर का चयन करने के लिए OpenFileDialog (OFD) का उपयोग करने के बारे में है, न कि FolderBrowserDialog (FBD)। मुझे लगता है कि FBD उपयोगकर्ता के दृष्टिकोण से भयानक है।
माइकल पॉलुकोनिस

25
वैकल्पिक रूप से टूट यूआई के साथ इस संवाद करने के लिए, एक का उपयोग CommonOpenFileDialog : new CommonOpenFileDialog { IsFolderPicker = true }
एवेस

113
कृपया, कभी इसका इस्तेमाल न करें ! मुझे याद है कि एक उपयोगकर्ता के रूप में मैं इन ग़रीब प्रोग्रामरों को दोषी ठहरा रहा था जिन्होंने इस भयानक पेड़ दृश्य संवाद (जो कि अभी FolderBrowserDialog है) के साथ एक और ऐप बनाया है । यह पूरी तरह से अनुपयोगी है: रूट डायर का एक गुच्छा, एक पसंदीदा पसंदीदा पैनल, और सबसे भयानक - आप वहां एक रास्ता भी नहीं चिपका सकते हैं! और अब एक प्रोग्रामर के रूप में मैं इसे इस्तेमाल करने के लिए एक सलाह देखता हूं ... कृपया, यह मत करो।
हाय-एंजेल

2
FolderBrowserDialog में एक बड़ी खामियों के अलावा बाकी सब कुछ है जो अन्य उपयोगकर्ताओं ने कहा। यह अंतिम चयनित पथ को याद नहीं करता है!
अलेक्स_

252

भविष्य के उपयोगकर्ताओं के लिए एक नोट के रूप में, जो उपयोग करने से बचना चाहते हैं FolderBrowserDialog, Microsoft ने एक बार WindowsAPICodePack नामक एक एपीआई जारी किया था जिसमें एक सहायक संवाद था CommonOpenFileDialog, जिसे एक IsFolderPickerमोड में सेट किया जा सकता था । एपीआई Microsoft से एक NuGet पैकेज के रूप में उपलब्ध है ।

यह सब मुझे स्थापित करने और उपयोग करने की आवश्यकता है CommonOpenFileDialog। (नूगेट ने आश्रितों को संभाला)

Install-Package Microsoft.WindowsAPICodePack-Shell

शामिल लाइन के लिए:

using Microsoft.WindowsAPICodePack.Dialogs;

उपयोग:

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

35
मुझे लगता है कि "फ़ोल्डर का चयन करने के लिए OpenFileDialog का उपयोग कैसे करें?" FolderBrowseDialog बहुत ही अनुपयोगी है। इस उत्तर के लिए धन्यवाद।
कोरे

46
इसका उत्तर होना चाहिए। और ध्यान दें कि आपको Microsoft.WindowsAPICodePack.Shellइसका उपयोग करने से पहले पैकेज को NuGet के माध्यम से स्थापित करने की आवश्यकता है CommonOpenFileDialog
smwikipedia

1
यदि आप VS2017 के साथ इसका उपयोग करते हैं तो यह आपकी मुख्य विंडो को पुनर्स्थापित करता है।
लोंगिएरे

1
FolderBrowserDialogउपयोगकर्ताओं के लिए ध्यान दें : एक साथ कई उदाहरण इसका उपयोग समस्याएं पैदा कर सकते हैं। यह CommonOpenFileDialogबेहतर है।
Alper

9
लगता है कि Microsoft ने इसे पुनः प्रकाशित किया हैWindowsAPICodePack-Shell
NucS

32

वहाँ एक hackish का उपयोग कर समाधान है OpenFileDialogजहां ValidateNamesऔर CheckFileExistsगलत पर दोनों सेट कर रहे हैं और FileNameसंकेत मिलता है कि एक निर्देशिका का चयन किया गया एक नकली मूल्य दिया जाता है।

मैं कहता हूं कि हैक करें क्योंकि यह उपयोगकर्ताओं को एक फ़ोल्डर का चयन करने के तरीके के बारे में भ्रमित कर रहा है। उन्हें वांछित फ़ोल्डर में रहने की आवश्यकता है और फिर फ़ाइल नाम "फ़ोल्डर चयन" कहते हुए बस ओपन दबाएं।

C # फ़ोल्डर चयन संवाद

यह डेनिस स्टैंकोवस्की द्वारा एक ही संवाद से चयनित फ़ाइल या फ़ोल्डर पर आधारित है ।

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

मैं देखता हूं, हां मैंने इसे काम कर लिया है। एक कष्टप्रद बात यह है कि Folder Selection.फ़ाइल नाम के अंत में इस तरह से निपटा जाएगा: C:\Folder Selection.मुझे लगता है कि आप हमेशा उन पात्रों को स्ट्रिंग से निकाल सकते हैं। फिर भी FolderBrowserDialog से बेहतर लगता है
कॉमरेडजोकूल

यह मेरे लिए काम नहीं करता है। यह मुझे फ़ोल्डर्स का चयन करने की अनुमति नहीं देगा। यह सिर्फ उन्हें खोलता है।
लोकियास

1
@ लोनिएरे यही मेरा मतलब है जब मैंने कहा कि यह एक हैक था। दूसरे पैराग्राफ से निर्देश देखें।
डैनियल बॉलिंजर

2
@ComradeJoecool आपको मैन्युअल रूप से मैन्युअल रूप से निकालने की आवश्यकता नहीं है। यह है कि कोड में अंतिम पंक्ति क्या है: स्ट्रिंग फ़ोल्डरपथ = Path.GetDirectoryName (folderBrowser.FileName);
हेरिबेटो लुगो

ओह! इस पद्धति के साथ एक समस्या है: यदि उपयोगकर्ता फ़ोल्डर्स ब्राउज़ करते समय ऊपर या पीछे बटन Openदबाते हैं, तो संवाद का मुख्य बटन अपेक्षा के अनुरूप काम नहीं करता है! इसका कारण है कि आप प्रचलित फ़ोल्डर में वापस जा सकते हैं! लेकिन यह तब काम करता है जब आप उन्हें चुनने के लिए फ़ोल्डर को डबल क्लिक करते हैं या प्रत्येक फ़ोल्डर के अंदर कुछ फ़ाइलों का चयन करते हैं (यदि कोई फ़ाइल जिसे आप चुन सकते हैं)
S.Serpooshan

14

अजीब बात है कि इतने उत्तर / वोट, लेकिन कोई भी उत्तर के रूप में निम्नलिखित कोड नहीं जोड़ता है:

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
क्या आपके उत्तर और @ Ionică Bizău उत्तर में कोई अंतर है ?
चेतन मेहरा

1
तर्क समान है, लेकिन मेरा उत्तर बहुत छोटा है और आपको DialogResult के लिए अतिरिक्त चर बनाने की कोई आवश्यकता नहीं है।
एंड्रयू

2
जैसा कि पहले ही उल्लेख किया गया है, इस पद्धति के साथ कुछ बड़ी समस्याएं हैं: यह एक भयानक पेड़ दृश्य संवाद है! आप इसमें कोई पथ कॉपी-पेस्ट नहीं कर सकते, आपको रूट फ़ोल्डर से एक-एक करके ड्रिल करना होगा और कोई पसंदीदा पैनल नहीं होगा!
एस। सेरपोशन

@ S.Serpooshan its कोई बात नहीं। यह किसी भी संवाद के उपयोग का एक नमूना मात्र है। आप चाहें तो किसी अन्य संवाद का उपयोग कर सकते हैं। :)
एंड्रयू

9

मुझे लगता है जैसे आप FolderBrowserDialog के बाद हो ।


5
मुझे लगता है कि यह डाउनवोटेड बी / सी (जैसा कि मिस्टिका पहले से ही बताया गया है) हो रहा है FolderBrowserDialog में भयानक प्रयोज्य है और ओपी स्पष्ट रूप से OpenFileDialog का उपयोग करना चाहता था।
mbx

3
@ समाधि शायद। निष्पक्ष होने के लिए, ओपी यह नहीं कहता है कि "मैं OpenFileDialog के अलावा कुछ भी उपयोग नहीं कर सकता"। जब मैंने मूल रूप से इसका जवाब दिया (साढ़े 4 साल पहले ...), तो यह धारणा थी कि ओपी को यह नहीं पता था कि उपयोगकर्ता को एक फ़ोल्डर कैसे खोलने दिया जाए। मैं वास्तव में इस प्रश्न को पोस्ट करने के बाद वापस नहीं आया, इसलिए मैंने प्रयोज्यता के बारे में किसी भी चर्चा को नहीं देखा है - और न ही उत्तर देते समय मैंने इस पर विचार किया।
साइमन व्हाइटहेड

6

यहां एक और समाधान है, जिसमें एक ही, सरल ज़िप फ़ाइल में सभी स्रोत उपलब्ध हैं।

यह अतिरिक्त विंडो झंडे के साथ OpenFileDialog प्रस्तुत करता है जो इसे विंडोज 7+ फ़ोल्डर चयन संवाद की तरह काम करता है।

वेबसाइट के अनुसार, यह सार्वजनिक डोमेन है: "कोई लाइसेंस नहीं है जैसे कि आप कोड के साथ लेने और करने के लिए स्वतंत्र हैं जो आप करेंगे।"

Archive.org लिंक:


1
पूरी तरह से काम!। इसके अलावा, आप "FolderSelectDialog.cs" में इस पंक्ति को जोड़कर कई फ़ोल्डर का चयन कर सकते हैं: सार्वजनिक स्ट्रिंग [] फ़ाइलनाम {{tod.FileNames की वापसी; }} और dd का परिवर्तन। निर्माता में
Maxter

5

Ookii Dialogs पुस्तकालयों पर एक नज़र डालें, जिसमें क्रमशः विंडोज फॉर्म और WPF के लिए एक फ़ोल्डर ब्राउज़र संवाद का कार्यान्वयन है।

यहां छवि विवरण दर्ज करें

Ookii.Dialogs.WinForms

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


Ookii.Dialogs.Wpf

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


अच्छा। नोट: Ookii.Dialogs को Microsoft .NET फ्रेमवर्क 4.5 या उच्चतर की आवश्यकता है। (WinXP में इस्तेमाल नहीं किया जा सकता)
S.Serpooshan

2
@ S.Serpooshan - अच्छा मुझे लगता है कि यह मेरे विंडोज 3.1 पीसी पर काम नहीं करेगा, है ना? लेकिन गंभीरता से, 2018 में, किसी को भी Windows XP के बारे में नहीं सोचना चाहिए - यह लंबे समय से मृत है।
rory.ap

@ rory.ap वास्तव में, मेरे लिए इस समाधान की मुख्य समस्या यह है कि यह फ़ोल्डर्स के लिए ब्राउज़ करते समय फ़ाइलों को नहीं दिखाता है। जब उपयोगकर्ता फ़ोल्डर का चयन करना चाहता है, तो कभी-कभी फ़ाइलों (उदाहरण के लिए संसाधित होने वाली छवियां) को देखने में सक्षम होना बहुत उपयोगी होता है!
एस। सेरपोशन

-5

यह सबसे स्पष्ट और सीधे आगे का रास्ता होना चाहिए

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
FolderBrowserDialogपहले ही कई बार यहाँ पेश किया जा चुका है, और गलत उत्तर है। यह एक पुराना और बहुत ही नॉन-यूजर-फ्रेंडली इंटरफ़ेस है। यह SHBrowseForFolderनीचे का उपयोग करता है, और यहां तक ​​कि डॉक्स स्थिति "विंडोज विस्टा के लिए या बाद में, यह अनुशंसा की जाती है कि आप फ़ंक्शन की तुलना में विकल्प के IFileDialogसाथ उपयोग करें । यह पिक फ़ोल्डर मोड में ओपन फाइल संवाद का उपयोग करता है और पसंदीदा कार्यान्वयन है।" FOS_PICKFOLDERSSHBrowseForFolder
हेरोहार्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.