2012-07-24 89 views
158

如何使用OpenFileDialog選擇文件夾?如何使用OpenFileDialog選擇文件夾?

我會使用以下項目:https://github.com/scottwis/OpenFileOrFolderDialog

不過,我面臨的一個問題。它使用GetOpenFileName函數和OPENFILENAME結構。並且OPENFILENAME有名爲templateID的成員。這是對話框模板的標識符。該項目也包含res1.rc文件和模板對話框init。但我無法弄清楚如何將這個文件附加到我的C#項目。

有沒有更好的方法使用OpenFileDialog來選擇文件夾?

+0

如果您打開項目文件與編輯器,你會發現在底部的一些額外的屬性:。你會看到它運行rc.exe來編譯資源文件res1.rc(一定要將「resource.h」也複製到你的項目中)。確保你安裝了VisualC,並且VCIcludePath指向一個正確的位置(github的一個指向VC9.0版本,你可能需要改變它)。編譯.rc文件後,生成的.res文件將作爲Win32Resource指令的可執行文件的資源添加。 – mistika 2014-06-24 15:07:06

+2

有一個使用OpenFileDialog的方法,其中'ValidateNames'和'CheckFileExists'都設置爲false,'FileName'被賦予一個模擬值來表示選擇一個目錄。我說黑客是因爲它讓用戶對如何選擇一個文件夾感到困惑。請參見[從同一對話框中選擇文件或文件夾](http://www.codeproject。com/Articles/44914 /從同一對話框中選擇文件或文件夾) – 2015-05-07 03:28:57

+0

[如何配置OpenFileDialog以選擇文件夾?](http://stackoverflow.com/questions/31059/how-do-you-configure-an-openfiledialog-to-select-folders) – 2016-04-14 14:13:22

回答

272

基本上你需要的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.IODirectory

+1

DialogResult result = fbd.ShowDialog();這個代碼中的用法是什麼? – AminM 2014-01-17 08:21:47

+1

@JesonPark從我讀的[這裏](http://stackoverflow.com/q/14813506/1420197)它用來確保用戶選擇一個文件夾,所有的東西都沒問題。在我的例子中,這只是無用的。請參閱[此答案](http://stackoverflow.com/a/14827454/1420197)以獲取更多信息。 – 2014-01-17 13:10:06

+88

FolderBrowserDialog的缺乏可用性。主要缺點是它不允許您從Windows資源管理器複製文件夾路徑以進行快速導航,因此當您需要向下鑽取三個以上的層級時,該路徑無效。鑽入每個文件夾是不希望的,特別是當存儲速度慢或者在其中一個層次上存在大量文件夾時。 – mistika 2014-06-24 15:25:40

15

聽起來像我,就像你剛剛在FolderBrowserDialog之後。

+2

我想這是得到downvoted b/c(正如mistika已經指出)的FolderBrowserDialog具有可怕的可用性和OP明確地想要使用OpenFileDialog。 – mbx 2016-12-19 14:39:09

+1

@mbx也許吧。公平地說,OP沒有說「我不能使用OpenFileDialog以外的任何東西」。當我最初回答這個問題時(4年半以前......),我們假設OP不知道如何讓用戶打開一個文件夾。在發佈這個答案之後,我沒有真正回到這個問題,所以我沒有看到任何有關可用性的討論 - 我在回答時也沒有考慮過這個問題。 – 2016-12-20 09:30:45

12

奇怪的是,這麼多的答案/票,但沒有人添加以下代碼作爲一個答案:

using (var folderDialog = new FolderBrowserDialog()) 
{ 
    if (folderDialog.ShowDialog() == DialogResult.OK) 
    { 

     // folderDialog.SelectedPath -- your result 
    } 
} 
+0

你的答案和@IonicăBizău[答案](答案是否有區別)(https://stackoverflow.com/questions/11624298/how-to-use-openfiledialog-to-select-a-folder/11624322#11624322)? – 2018-01-29 07:37:35

+0

邏輯是一樣的,但我的答案要短得多,你不需要爲DialogResult創建額外的變量。 – Andrew 2018-01-30 21:23:15

63

至於未來的用戶需注意誰想要避免使用FolderBrowserDialog,微軟用於發佈名爲WindowsAPICodePack的API,該API有一個有用的對話框CommonOpenFileDialog,可以將其設置爲IsFolderPicker模式。

如果你有機會獲得的NuGet包,它仍然可以在公共列表爲WindowsAPICodePack

對於包括行:

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); 
} 
+5

我認爲這是「如何使用OpenFileDialog選擇文件夾?」的最近答案。 FolderBrowseDialog非常不可用。謝謝你的回答。 – Koray 2017-03-30 08:52:10

+0

這是一個很棒的發現,非常感謝。我一直在整個下午都在尋找這樣簡單的事情! – Taegost 2017-06-07 19:00:31

+0

這選擇一個文件,而不是文件夾... – miguelmpn 2017-08-09 09:16:02

相關問題