ডিরেক্টরি ডায়লগ খুলুন


274

আমি ব্যবহারকারীকে এমন একটি ডিরেক্টরি বাছাই করতে চাই যেখানে আমি তৈরি করব এমন একটি ফাইল সংরক্ষণ করা হবে। আমি জানি যে ডাব্লুপিএফ-এ আমার OpenFileDialogউইন 32 থেকে ব্যবহার করা উচিত , তবে দুর্ভাগ্যক্রমে ডায়ালগটির জন্য ফাইল (গুলি) নির্বাচন করা দরকার - এটি যদি না খালি আমি ওকে ক্লিক না করে ঠিক ক্লিক করি তবে তা খোলা থাকে। আমি ব্যবহারকারীকে একটি ফাইল বাছতে দিয়ে তার কার্যকারিতাটি "হ্যাক" করতে পারতাম এবং তারপরে কোন ডিরেক্টরিটি এটির অন্তর্গত তা নির্ধারণের জন্য পথটি স্ট্রিপ করে ফেলতে পারি তবে এটি সর্বোত্তম un এর আগে কি কেউ দেখেছেন?




উত্তর:


406

আপনি এর জন্য বিল্ট-ইন ফোল্ডার ব্রাউজারডায়ালগ ক্লাসটি ব্যবহার করতে পারেন । এটি System.Windows.Formsনেমস্পেসে আছে তা মনে করবেন না ।

using (var dialog = new System.Windows.Forms.FolderBrowserDialog())
{
    System.Windows.Forms.DialogResult result = dialog.ShowDialog();
}

আপনি যদি কিছু ডাব্লুপিএফ উইন্ডোটির উপরে উইন্ডোটি মডেল হতে চান তবে ডাব্লুপিএফ অ্যাপ্লিকেশন থেকে ফোল্ডার ব্রাউজারডায়ালগ কীভাবে ব্যবহার করবেন সে প্রশ্নটি দেখুন ।


সম্পাদনা: আপনি যদি সরল, কুরুচিপূর্ণ উইন্ডোজ ফর্মস ফোল্ডার ব্রাউজারডায়ালগের চেয়ে কিছুটা অভিনব কিছু চান তবে কিছু বিকল্প রয়েছে যা আপনাকে পরিবর্তে ভিস্তার ডায়ালগটি ব্যবহার করার অনুমতি দেয়:

  • তৃতীয় পক্ষের লাইব্রেরি যেমন ওওকি ডায়ালগগুলি (.NET 3.5)
  • উইন্ডোস API কোড প্যাক-শেল :

    using Microsoft.WindowsAPICodePack.Dialogs;
    
    ...
    
    var dialog = new CommonOpenFileDialog();
    dialog.IsFolderPicker = true;
    CommonFileDialogResult result = dialog.ShowDialog();

    নোট করুন যে এই ডায়ালগটি উইন্ডোজ ভিস্তার চেয়ে পুরানো অপারেটিং সিস্টেমে উপলভ্য নয়, তাই CommonFileDialog.IsPlatformSupportedআগে যাচাই করে নিন ।


78
মনে রাখবেন যে এটি একটি ভয়াবহ সংলাপ। আপনি এতে কোনও পাথ অনুলিপি এবং আটকানোতে পারবেন না এবং এটি প্রিয় ফোল্ডারগুলিকে সমর্থন করে না। সামগ্রিকভাবে, আমি এটিকে 5 এর মধ্যে 0 দিচ্ছি এবং কেউ কখনও এটি ব্যবহার না করার পরামর্শ দিচ্ছি। উইন্ডোজ ভিস্তা আরও ভাল ফোল্ডার ডায়ালগটি না উপস্থিত হওয়া পর্যন্ত কোনও যুক্তিসঙ্গত বিকল্প ছিল না । আছে ভাল বিনামূল্যে লাইব্রেরি যে ভিস্তা + + ভাল ডায়ালগ, এবং XP তে খারাপ প্রদর্শন করুন।
রোমান স্টারকভ

70
তবুও, ডাব্লুপিএফ কেন একটি দুর্দান্ত ওপেন ফায়ালডায়ালগ অফার করে তবে ওপেনফোল্ডার ডায়ালগ দেয় না? কিছুটা কি অদ্ভুত নয়? এখানে ডাব্লুপিএফের অভাব কেন? এই ডায়ালগের জন্য ডাব্লুপিএফ-তে কোনও ক্লাস যুক্ত করার পরিকল্পনা রয়েছে কি?
পল-সেবাস্তিয়ান মানোলে

14
ভুলে যাবেন না যে ফোল্ডার ব্রাউজার ডায়ালগটি ডিসপোজেবল is
লসমনোস

9
নোট করুন যে আপনার প্রয়োজন CommonOpenFileDialogথেকে ব্যবহার WindowsAPICodePackকরতে হবে Install-Package WindowsAPICodePack-Shell। উত্তরে প্রদত্ত লিঙ্কটি সেই তালিকাভুক্ত নয়।
নিকোলা নোভাক

5
"টাইপ বা নেমস্পেস কমনওপেন ফাইল ফাইলটি পাওয়া যায়নি"। এটি 2017 এবং আমি একটি ফোল্ডার
নিক.এমসিডার্মাইড

46

আমি একটি ইউজারকন্ট্রোল তৈরি করেছি যা এটির মতো ব্যবহৃত হয়:

  <UtilitiesWPF:FolderEntry Text="{Binding Path=LogFolder}" Description="Folder for log files"/>

এক্সএএমএল উত্সটি দেখে মনে হচ্ছে:

<UserControl x:Class="Utilities.WPF.FolderEntry"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <DockPanel>
        <Button Margin="0" Padding="0" DockPanel.Dock="Right" Width="Auto" Click="BrowseFolder">...</Button>
        <TextBox Height="Auto" HorizontalAlignment="Stretch" DockPanel.Dock="Right" 
           Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
    </DockPanel>
</UserControl>

এবং কোড পিছনে

public partial class FolderEntry {
    public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(FolderEntry), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
    public static DependencyProperty DescriptionProperty = DependencyProperty.Register("Description", typeof(string), typeof(FolderEntry), new PropertyMetadata(null));

    public string Text { get { return GetValue(TextProperty) as string; } set { SetValue(TextProperty, value); }}

    public string Description { get { return GetValue(DescriptionProperty) as string; } set { SetValue(DescriptionProperty, value); } }

    public FolderEntry() { InitializeComponent(); }

    private void BrowseFolder(object sender, RoutedEventArgs e) {
        using (FolderBrowserDialog dlg = new FolderBrowserDialog()) {
            dlg.Description = Description;
            dlg.SelectedPath = Text;
            dlg.ShowNewFolderButton = true;
            DialogResult result = dlg.ShowDialog();
            if (result == System.Windows.Forms.DialogResult.OK) {
                Text = dlg.SelectedPath;
                BindingExpression be = GetBindingExpression(TextProperty);
                if (be != null)
                    be.UpdateSource();
            }
        }
    }
 }

1
+1, কীভাবে একটি ইউজারকন্ট্রোল লিখবেন তার দুর্দান্ত উদাহরণ। একটি প্রশ্ন: আপনার দরকার কেন be.UpdateSource? নির্ভরতা বৈশিষ্ট্যগুলিতে বিজ্ঞপ্তিগুলি স্বয়ংক্রিয় হওয়া উচিত নয়?
হিনজি

4
আপডেটগুলি কখন ফায়ার করতে হবে তা আপনি বাইন্ডিংয়ে নির্দিষ্ট করতে পারেন। ডিফল্টরূপে এটি লস্টফোকাসে রয়েছে তবে আপনি এটি সম্পত্তির পরিবর্তিত আপডেটগুলিতেও বলতে পারেন।
আলেকজান্দ্রা

3
বাঁধাইয়ের পরে প্রতিটি কীস্ট্রোকের জন্য আপডেট করা হবে। ব্যবহারকারী আপডেটে কিছু প্রকারের বৈধতা (উদাহরণস্বরূপ ডিরেক্টরি। এক্সজিস্ট) করলে সমস্যা হতে পারে।
অ্যাড্রিনিম


10

ওকেই ফোল্ডার ডায়ালগটি নুগেটে পাওয়া যাবে।

PM> Install-Package Ookii.Dialogs

এবং উদাহরণ কোডটি নীচের মতো।

var dialog = new Ookii.Dialogs.Wpf.VistaFolderBrowserDialog();
if (dialog.ShowDialog(this).GetValueOrDefault())
{
    textBoxFolderPath.Text = dialog.SelectedPath;
}

tnx আপনার পথটি সবচেয়ে সংক্ষিপ্ত ছিল
এহসান wwe

8

যারা কাস্টম ডায়লগ তৈরি করতে চান না তবে এখনও 100% ডাব্লুপিএফ উপায় পছন্দ করেন এবং পৃথক ডিডিএল, অতিরিক্ত নির্ভরতা বা পুরানো এপিআই ব্যবহার করতে চান না তাদের জন্য সংরক্ষণ করুন ডায়ালগটি ব্যবহার করে আমি খুব সাধারণ একটি হ্যাক নিয়ে এসেছি।

কোনও নির্দেশের প্রয়োজন নেই, আপনি কেবল নীচের কোডটি কপি-পেস্ট করতে পারেন!

এটি এখনও খুব ব্যবহারকারী-বান্ধব হওয়া উচিত এবং বেশিরভাগ লোকেরা কখনই লক্ষ্য করবে না।

ধারণাটি এই সত্য থেকে আসে যে আমরা সেই কথোপকথনের শিরোনামটি পরিবর্তন করতে পারি, ফাইলগুলি আড়াল করতে পারি এবং ফলস্বরূপ ফাইল নামটি প্রায় সহজেই কাজ করতে পারি।

এটি নিশ্চিতভাবেই একটি বড় হ্যাক, তবে সম্ভবত এটি আপনার ব্যবহারের জন্য ঠিক কাজটি করবে ...

এই উদাহরণে আমার কাছে একটি পাঠ্যবাক্সের অবজেক্টটি রয়েছে যাতে ফলস পথটি রয়েছে, তবে আপনি সম্পর্কিত রেখাগুলি সরিয়ে ফেলতে পারেন এবং যদি আপনি চান তবে একটি রিটার্ন মান ব্যবহার করতে পারেন ...

// Create a "Save As" dialog for selecting a directory (HACK)
var dialog = new Microsoft.Win32.SaveFileDialog();
dialog.InitialDirectory = textbox.Text; // Use current value for initial dir
dialog.Title = "Select a Directory"; // instead of default "Save As"
dialog.Filter = "Directory|*.this.directory"; // Prevents displaying files
dialog.FileName = "select"; // Filename will then be "select.this.directory"
if (dialog.ShowDialog() == true) {
    string path = dialog.FileName;
    // Remove fake filename from resulting path
    path = path.Replace("\\select.this.directory", "");
    path = path.Replace(".this.directory", "");
    // If user has changed the filename, create the new directory
    if (!System.IO.Directory.Exists(path)) {
        System.IO.Directory.CreateDirectory(path);
    }
    // Our final value is in path
    textbox.Text = path;
}

এই হ্যাকের সাথে একমাত্র সমস্যাগুলি হ'ল:

  • স্বীকৃতি বোতামটি "ডিরেক্টরি নির্বাচন করুন" এর মতো কিছু পরিবর্তে "সংরক্ষণ করুন" বলছে, তবে খনিগুলির মতো ক্ষেত্রে আমি ডিরেক্টরি নির্বাচন "সংরক্ষণ" করি যাতে এটি এখনও কার্যকর হয় ...
  • ইনপুট ক্ষেত্রটি এখনও "ডিরেক্টরি নাম" এর পরিবর্তে "ফাইলের নাম" বলে, তবে আমরা বলতে পারি যে ডিরেক্টরিটি এক ধরণের ফাইল ...
  • এখনও "টাইপ হিসাবে সংরক্ষণ করুন" ড্রপডাউন রয়েছে, তবে এর মানটি "ডিরেক্টরি (* .This.directory)" বলে, এবং ব্যবহারকারী এটি অন্য কোনও কারণে পরিবর্তন করতে পারে না, আমার পক্ষে কাজ করে ...

বেশিরভাগ লোকেরা এগুলি লক্ষ্য করবে না, যদিও আমি অবশ্যই মাইক্রোসফ্টগুলি তাদের গাধাগুলি থেকে মাথা বের করে আনতে চাইলে অফিসিয়াল ডাব্লুপিএফ উপায়টি ব্যবহার করতে পছন্দ করব তবে তারা যতক্ষণ না করে, এটিই আমার অস্থায়ী স্থিরতা।


1
এটি দুর্দান্ত ছিল। অবাক করে দিয়ে দেখেন যে অন্য কেউ এ চেষ্টা করেছে বলে মনে হয় না। নুগেট প্যাকেজটি অবশ্যই আরও অনেক ভাল তবে নিউগেট উইন্ডোজএপিকোডপ্যাক ছাড়াই কোনও নতুন প্যাকেজ / রেফারেন্স যুক্ত না করে কোনও ফোল্ডার নির্বাচন করার ক্ষমতা হ্যাক করার এটি একটি দুর্দান্ত উপায়।
কোড নভিস

7

ডিরেক্টরি কথোপকথনের জন্য ডিরেক্টরি ডায়ালগের জন্য প্রথমে রেফারেন্স সিস্টেম. উইন্ডোজ.ফর্মগুলি যুক্ত করুন এবং তারপরে সমাধান করুন এবং তারপরে এই কোডটি একটি বোতাম ক্লিক করুন put

    var dialog = new FolderBrowserDialog();
    dialog.ShowDialog();
    folderpathTB.Text = dialog.SelectedPath;

(ফোল্ডারপথটিবি হ'ল পাঠ্যবক্সের নাম যেখানে আমি ফোল্ডারটির পাথ রেখেছি, বা আপনি এটি স্ট্রিং ভেরিয়েবলের কাছেও অর্পণ করতে পারেন অর্থাত))

    string folder = dialog.SelectedPath;

এবং যদি আপনি ফাইলের নাম / পাথ পেতে চান তবে কেবল বোতাম ক্লিক এ করুন

    FileDialog fileDialog = new OpenFileDialog();
    fileDialog.ShowDialog();
    folderpathTB.Text = fileDialog.FileName;

(ফোল্ডারপথটিবি হ'ল টেক্সটবক্সের নাম যেখানে আমি ফাইলের পথটি রেখেছিলাম, অথবা আপনি এটি স্ট্রিং ভেরিয়েবলকেও বরাদ্দ করতে পারেন)

দ্রষ্টব্য: ফোল্ডার সংলাপের জন্য, সিস্টেম. উইন্ডোজ.ফর্মস.ডিল অবশ্যই প্রজেক্টে যুক্ত করা উচিত, অন্যথায় এটি কাজ করবে না।


আপনার উত্তরের জন্য ধন্যবাদ তবে ইতিমধ্যে উপরে @ হাইঞ্জি দ্বারা এই পদ্ধতির ব্যাখ্যা করা হয়েছে।
আলেকজান্দ্রা

5

আমি নীচের লিঙ্কে নীচের কোডটি পেয়েছি ... এবং এটি কাজ করেছে ফোল্ডার ডায়ালগ ডাব্লুপিএফ নির্বাচন করুন

using Microsoft.WindowsAPICodePack.Dialogs;

var dlg = new CommonOpenFileDialog();
dlg.Title = "My Title";
dlg.IsFolderPicker = true;
dlg.InitialDirectory = currentDirectory;

dlg.AddToMostRecentlyUsedList = false;
dlg.AllowNonFileSystemItems = false;
dlg.DefaultDirectory = currentDirectory;
dlg.EnsureFileExists = true;
dlg.EnsurePathExists = true;
dlg.EnsureReadOnly = false;
dlg.EnsureValidNames = true;
dlg.Multiselect = false;
dlg.ShowPlacesList = true;

if (dlg.ShowDialog() == CommonFileDialogResult.Ok) 
{
  var folder = dlg.FileName;
  // Do something with selected folder string
}

4

আপনি যা চান তা অর্জনের সর্বোত্তম উপায় হ'ল আপনার নিজস্ব ডাব্লুপিএফ ভিত্তিক নিয়ন্ত্রণ তৈরি করা, বা এমন একটি ব্যবহার করুন যা অন্য লোকেদের দ্বারা তৈরি করা হয়েছিল
কেন? কারণ ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে উইনফর্মস ডায়ালগটি ব্যবহার করার সময় একটি লক্ষণীয় পারফরম্যান্স প্রভাব পড়বে (কোনও কারণে)
আমি এই প্রকল্পটি
https://opendialog.codeplex.com/
বা নিউগেটের প্রস্তাব দিই:

PM> Install-Package OpenDialog

এটি খুব এমভিভিএম বান্ধব এবং এটি উইনফর্মস ডায়ালগটি মোড়চ্ছে না


3

আমি পরামর্শ দেব, ন্যুগেট প্যাকেজটিতে যুক্ত করার জন্য:

  Install-Package OpenDialog

তারপরে এটি ব্যবহারের উপায় হ'ল:

    Gat.Controls.OpenDialogView openDialog = new Gat.Controls.OpenDialogView();
    Gat.Controls.OpenDialogViewModel vm = (Gat.Controls.OpenDialogViewModel)openDialog.DataContext;
    vm.IsDirectoryChooser = true;
    vm.Show();

    WPFLabel.Text = vm.SelectedFilePath.ToString();

এখানে ডকুমেন্টেশন: http://opendialog.codeplex.com/docamentation

ফাইল, ফিল্টারযুক্ত ফাইল, ফোল্ডার ইত্যাদির জন্য কাজ করে


2

ওকিই VistaFolderBrowserDialogহ'ল তুমি চাই।

যদি আপনি কেবল ওকি ডায়ালগগুলি থেকে অন্য কোনও ফোল্ডার ব্রাউজার চান এবং তবে উত্সটি ডাউনলোড করুন , ফোল্ডার ব্রাউজারের জন্য আপনার প্রয়োজনীয় ফাইলগুলি চেরি-বাছাই করুন (ইঙ্গিত: 7 টি ফাইল) এবং এটি নেট .৪.২.২ এ জরিমানা তৈরি করে। আমাকে একটি রেফারেন্স যোগ করতে হয়েছিল System.Drawing। মূল প্রকল্পের রেফারেন্সগুলি আপনার সাথে তুলনা করুন।

আপনি কোন ফাইলগুলি কীভাবে আবিষ্কার করবেন? আপনার ভিজ্যুয়াল স্টুডিওর উদাহরণগুলিতে আপনার অ্যাপ এবং ওওকি খুলুন i যোগ VistaFolderBrowserDialog.csআপনার অ্যাপ্লিকেশানে এবং যোগ ফাইল রাখার পর্যন্ত বিল্ড ত্রুটি দূরে যান। আপনি ওওকি প্রকল্পে নির্ভরতা খুঁজে পান - আপনি যার উত্সটিতে ফিরে যেতে চান তার নিয়ন্ত্রণ করুন-ক্লিক করুন (পাং উদ্দেশ্যে)।

আপনি যদি খুব অলস হন তবে আপনার প্রয়োজনীয় ফাইলগুলি এখানে ...

NativeMethods.cs
SafeHandles.cs
VistaFolderBrowserDialog.cs
\ Interop
   COMGuids.cs
   ErrorHelper.cs
   ShellComInterfaces.cs
   ShellWrapperDefinitions.cs

আপনি VistaFolderBrowserDialog.csযদি লাইনটি না যুক্ত করতে চান তবে 197 লাইনটি সম্পাদনা করুনResources.Resx

নতুন অবৈধ অপারেশন এক্সসেপশন (বৈশিষ্ট্য। রিসোর্স। ফোল্ডার ব্রাউজারডায়ালগ নো রুটফোল্ডার) নিক্ষেপ করুন;

throw new InvalidOperationException("Unable to retrieve the root folder.");

তাদের অ্যাপ্লিকেশনগুলিতে তাদের কপিরাইট বিজ্ঞপ্তি যুক্ত করুন license.txt

কোড \Ookii.Dialogs.Wpf.Sample\MainWindow.xaml.csলাইন 160-169 একটি উদাহরণ আপনি ব্যবহার করতে পারেন কিন্তু আপনি সরাতে হবে this,থেকে MessageBox.Show(this,WPF জন্য।

আমার মেশিনে কাজ করে [টিএম]


2

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে এটি করার একটি সহজ উপায় হ'ল ডাব্লুপিএফ দ্বারা সরবরাহিত ফাইলডায়ালগ বিকল্পটি ব্যবহার করা এবং System.IO.Path.GetDirectory (ফাইলের নাম) ব্যবহার করা।


তবে তারপরে ব্যবহারকারীকে একটি ফাইল চয়ন করতে হবে যদিও তাকে ফোল্ডারটি বেছে নেওয়ার কথা বলা হয়েছে। একটি অনভিজ্ঞ ব্যবহারকারী এই মুহুর্তে হেল্পডেস্ককে কল করতে পারে, যখন ফোল্ডারটি বেছে নিতে হয় তখন তাকে কেন ফাইল চয়ন করতে হবে তা জিজ্ঞাসা করে
chriszo111

0

এই উত্তরগুলির কোনওটিই আমার পক্ষে কাজ করেনি (সাধারণত এই রেখাগুলির সাথে অনুপস্থিত রেফারেন্স বা কিছু ছিল)

তবে এটি বেশ সহজভাবে করেছেন:

ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে ফোল্ডার ব্রাউজারডায়ালগ ব্যবহার করা

এই কোডটিতে একটি রেফারেন্স যুক্ত করুন System.Windows.Formsএবং ব্যবহার করুন:

  var dialog = new System.Windows.Forms.FolderBrowserDialog();
  System.Windows.Forms.DialogResult result = dialog.ShowDialog();

অনুপস্থিত প্যাকেজগুলি ট্র্যাক করার দরকার নেই। অথবা প্রচুর ক্লাস যুক্ত করুন

এটি আমাকে একটি আধুনিক ফোল্ডার নির্বাচনকারী দেয় যা আপনাকে একটি নতুন ফোল্ডার তৈরি করতে দেয়

অন্যান্য মেশিনে মোতায়েনের সময় আমি এখনও প্রভাবটি দেখতে পাচ্ছি না


0

আপনি ডাব্লুপিএফ এ জাতীয় স্মিট ব্যবহার করতে পারেন। আমি উদাহরণ পদ্ধতি তৈরি করেছি। নীচে চেক করুন।

public string getFolderPath()
{
           // Create OpenFileDialog 
           Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();

           OpenFileDialog openFileDialog = new OpenFileDialog();
           openFileDialog.Multiselect = false;

           openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
           if (openFileDialog.ShowDialog() == true)
           {
               System.IO.FileInfo fInfo = new System.IO.FileInfo(openFileDialog.FileName);
               return fInfo.DirectoryName;
           }
           return null;           
       }

1
এটির জন্য ফোল্ডারটি থেকে একটি ফাইল নির্বাচন করা প্রয়োজন। যদি ফোল্ডারটি খালি থাকে তবে আপনি আপনার ফোল্ডারটি নির্বাচন করতে পারবেন না।
আলেকজান্দ্রু ডিকু

হ্যাঁ, আমি বুঝতে পেরেছি যে, এটি কিছু মীমাংসাকারী কাজ, এই সমস্যার সঠিক সমাধান নয়।
koberone
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.