Làm cách nào để sử dụng OpenFileDialog để chọn thư mục?


296

Làm thế nào để sử dụng OpenFileDialogđể chọn thư mục?

Tôi sẽ sử dụng dự án sau: https://github.com/scottwis/OpenFileOrFolderDialog

Tuy nhiên, tôi phải đối mặt với một vấn đề. Nó sử dụng GetOpenFileNamechức năng và OPENFILENAMEcấu trúc. Và OPENFILENAMEcó tên thành viên templateID. Đây là định danh cho mẫu hộp thoại. Và dự án chứa res1.rctập tin và init hộp thoại templated, quá. Nhưng tôi không thể tìm ra cách đính kèm tệp này vào dự án C # của mình.

Có cách nào tốt hơn để sử dụng một OpenFileDialogđể chọn thư mục?


Nếu bạn mở tệp dự án bằng trình chỉnh sửa, bạn sẽ thấy một số thuộc tính bổ sung ở phía dưới: <VCIncludePath ...>, <Win32Resource ...> và <Target Name = "BeforeBuild" ...>. Bạn sẽ thấy rằng nó chạy RC.exe để biên dịch tệp tài nguyên res1.rc (hãy chắc chắn sao chép "resource.h" vào dự án của bạn). Hãy chắc chắn rằng bạn đã cài đặt VisualC và VCIncludePath trỏ đến một vị trí thích hợp (một điểm của github là phiên bản VC9.0 và bạn có thể cần phải thay đổi nó). Sau khi biên dịch tệp .rc, tệp .res kết quả được thêm làm tài nguyên cho tệp thực thi của bạn với lệnh Win32Resource.
Mistika

3
Có một giải pháp hackish sử dụng OpenFileDialog trong đó ValidateNamesCheckFileExistscả hai đều được đặt thành false và FileNameđược cung cấp một giá trị giả để chỉ ra rằng một thư mục được chọn. Tôi nói hack vì nó gây nhầm lẫn cho người dùng về cách chọn thư mục. Xem Chọn tệp hoặc thư mục từ cùng một hộp thoại
Daniel Ballinger

1
Thanx Dan đã chỉ vào OpenFileDialog-Hack! Điều đó tốt hơn nhiều so với FolderBrowserDialog, vì OFD hiển thị các thư mục được đánh dấu, v.v., vì vậy mọi người - đặc biệt là trong các công ty lớn hơn - tìm thấy tào lao của họ. FBD sẽ không làm tốt ở những nơi đó.
JayC667

1
@ComradeJoecool Tôi đã chuyển đổi nhận xét của mình thành câu trả lời . Tôi đã thử nó nhiều lần và không gặp vấn đề "không tìm thấy tập tin". Bạn có đang sử dụng lại ví dụ OpenFileDialog không?
Daniel Ballinger

1
@DanielBallinger ah, tôi thấy vấn đề của tôi, vì tôi đang sử dụng Powershell để tạo ra hộp thoại, thiết lập ValidateNamesCheckFileExistsđể falsekhông làm việc, tôi cần phải đặt chúng vào 0(hoặc tìm hiểu PowerShell tốt hơn)
ComradeJoecool

Câu trả lời:


398

Về cơ bản bạn cần FolderBrowserDialoglớp:

Nhắc người dùng chọn thư mục. Lớp này không thể được thừa kế.

Thí dụ:

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

Nếu bạn làm việc trong WPF, bạn phải thêm tài liệu tham khảo System.Windows.Forms.

bạn cũng phải thêm using System.IOcho Directorylớp học


185
FolderBrowserDialog thiếu khả năng sử dụng. Nhược điểm chính là nó không cho phép bạn sao chép đường dẫn thư mục từ Windows Explorer để điều hướng nhanh, khiến nó trở nên vô dụng khi bạn cần đi sâu hơn ba cấp độ. Việc đi sâu vào từng thư mục là không mong muốn, đặc biệt là khi lưu trữ chậm hoặc khi bạn có nhiều thư mục ở một trong các cấp.
Mistika

2
Câu hỏi cụ thể là về việc sử dụng OpenFileDialog (OFD) để chọn một thư mục, không phải là FolderBrowserDialog (FBD). Tôi đồng tình rằng FBD là khủng khiếp từ quan điểm người dùng.
Michael Paulukonis

26
Ngoài ra với hộp thoại này với giao diện người dùng bị hỏng, hãy sử dụng CommonOpenFileDialog : new CommonOpenFileDialog { IsFolderPicker = true }.
Ngày

113
Xin đừng bao giờ sử dụng nó ! Tôi nhớ với tư cách là một người dùng, tôi đã đổ lỗi cho những lập trình viên nghèo này đã tạo ra một ứng dụng khác với hộp thoại xem cây khủng khiếp này (chỉ là FolderBrowserDialog) . Nó hoàn toàn không sử dụng được: một loạt các thư mục gốc, bảng điều khiển yêu thích bị thiếu và khủng khiếp nhất - bạn thậm chí không thể dán một đường dẫn ở đó! Và bây giờ là một lập trình viên, tôi thấy một lời khuyên để sử dụng nó. Xin vui lòng, đừng làm điều đó.
Hi-Angel

2
FolderBrowserDialog có một lỗ hổng lớn bên cạnh mọi thứ khác mà những người dùng khác nói. Nó không nhớ con đường đã chọn cuối cùng!
AleX_

253

Lưu ý cho những người dùng trong tương lai muốn tránh sử dụng FolderBrowserDialog, Microsoft đã từng phát hành một API có tên WindowsAPICodePack có một hộp thoại hữu ích được gọi CommonOpenFileDialog, có thể được đặt thành IsFolderPickerchế độ. API có sẵn từ Microsoft dưới dạng gói NuGet .

Đây là tất cả những gì tôi cần để cài đặt và sử dụng CommonOpenFileDialog. (NuGet xử lý các phụ thuộc)

Install-Package Microsoft.WindowsAPICodePack-Shell

Đối với dòng bao gồm:

using Microsoft.WindowsAPICodePack.Dialogs;

Sử dụng:

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

36
Tôi nghĩ rằng đây là câu trả lời gần nhất cho "Cách sử dụng OpenFileDialog để chọn thư mục?" FolderBrowseDialog rất không sử dụng được. Cảm ơn bạn cho câu trả lời này.
Koray

46
Đây nên là câu trả lời. Và lưu ý rằng bạn cần cài đặt Microsoft.WindowsAPICodePack.Shellgói thông qua NuGet trước khi bạn có thể sử dụng gói này CommonOpenFileDialog.
smwikipedia

1
Nếu bạn sử dụng điều này với VS2017, nó sẽ điều chỉnh lại cửa sổ chính của bạn.
Lokiare

1
Lưu ý cho FolderBrowserDialogngười dùng: sử dụng nhiều phiên bản đồng thời của nó có thể tạo ra vấn đề. Điều này CommonOpenFileDialoglà tốt hơn.
Alper

9
Microsoft dường như đã tái xuất bản nó dưới dạngWindowsAPICodePack-Shell
NucS 16/12/19

32

Có một giải pháp hackish sử dụng OpenFileDialogở đâu ValidateNamesCheckFileExistscả hai đều được đặt thành false vàFileName được cung cấp một giá trị giả để chỉ ra rằng một thư mục được chọn.

Tôi nói hack vì nó gây nhầm lẫn cho người dùng về cách chọn thư mục. Họ cần phải ở trong thư mục mong muốn và sau đó chỉ cần nhấn Mở trong khi tên tệp cho biết "Lựa chọn thư mục".

Hộp thoại chọn thư mục C #

Điều này dựa trên Chọn tệp hoặc thư mục từ cùng một hộp thoại của 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);
    // ...
}

Tôi thấy, vâng tôi đã làm cho nó hoạt động. Một điều khó chịu là nó Folder Selection.sẽ được xử lý ở phần cuối của tên tệp như vậy: C:\Folder Selection.Tôi đoán bạn luôn có thể xóa các ký tự đó khỏi chuỗi. Vẫn có vẻ tốt hơn so với FolderBrowserDialog
ComradeJoecool

Điều này không làm việc cho tôi. Nó sẽ không cho phép tôi chọn các thư mục. Nó chỉ mở chúng.
Lokiare

1
@Lokiare Đó là ý của tôi khi tôi nói đó là hack. Xem hướng dẫn từ đoạn thứ hai.
Daniel Ballinger

2
@ComradeJoecool bạn không phải xóa thủ công. đó là những gì dòng cuối cùng trong mã dành cho: string folderPath = Path.GetDirectoryName (thư mụcBrowser.FileName);
Heriberto Lugo

Oh! Có một vấn đề với phương pháp này: nếu người dùng nhấn nút Lên hoặc Quay lại khi duyệt các thư mục, Opennút chính của hộp thoại không hoạt động như mong đợi! nó khiến bạn nhảy trở lại thư mục trước! nhưng nó hoạt động khi bạn chỉ cần nhấp đúp vào thư mục để chọn chúng hoặc chọn một số tệp trong mỗi thư mục (nếu có bất kỳ tệp nào bạn có thể chọn)
S.Serpooshan

14

Kỳ lạ là có rất nhiều câu trả lời / phiếu bầu, nhưng không ai thêm đoạn mã sau làm câu trả lời:

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
Có sự khác biệt nào giữa câu trả lời của bạn và @ Ionică Bizău Trả lời không?
Chetan Mehra

1
Logic là như nhau, nhưng câu trả lời của tôi ngắn hơn nhiều và bạn không cần phải tạo thêm biến cho DialogResult.
Andrew

2
Như đã đề cập, có một số vấn đề lớn với phương pháp này: đây là một hộp thoại xem cây khủng khiếp! bạn không thể sao chép-dán một đường dẫn vào đó, bạn phải khoan từng cái một từ thư mục gốc và không có bảng điều khiển yêu thích!
S.Serpooshan

@ S.Serpooshan tôi không quan trọng. Đây chỉ là một mẫu sử dụng hộp thoại BẤT K .. Bạn có thể sử dụng bất kỳ hộp thoại khác nếu bạn muốn. :)
Andrew

9

Âm thanh đối với tôi giống như bạn chỉ sau Thư mụcBrowserDialog .


5
Tôi đoán điều này đang bị hạ cấp b / c (như mistika đã chỉ ra), FolderBrowserDialog có khả năng sử dụng khủng khiếp và OP rõ ràng muốn sử dụng OpenFileDialog.
mbx

3
@mbx Có lẽ. Công bằng mà nói, OP không nói "Tôi không thể sử dụng bất cứ thứ gì ngoài OpenFileDialog". Khi tôi trả lời ban đầu (hơn 4 năm rưỡi trước ...), giả định là OP chỉ không biết cách để người dùng mở thư mục. Tôi đã không thực sự trở lại câu hỏi này sau khi đăng câu trả lời này vì vậy tôi chưa thấy bất kỳ cuộc thảo luận nào về khả năng sử dụng - tôi cũng không xem xét nó khi trả lời.
Simon Whitehead

6

Đây là một giải pháp khác, có tất cả các nguồn có sẵn trong một tệp ZIP đơn giản.

Nó trình bày OpenFileDialog với các cờ cửa sổ bổ sung giúp nó hoạt động giống như hộp thoại Chọn thư mục Windows 7+.

Trên mỗi trang web, đó là miền công cộng: "Không có giấy phép như bạn có thể tự do lấy và làm với mã những gì bạn sẽ làm."

Liên kết Archive.org:


1
Làm việc hoàn hảo!. Ngoài ra, bạn có thể làm cho nó chọn nhiều thư mục bằng cách thêm dòng này vào "FolderSelectDialog.cs": chuỗi công khai [] FileNames {get {return ofd.FileNames; }} và thay đổi ofd.Multiselect = true; trong hàm tạo
Maxter

5

Hãy nhìn vào thư viện Ookii Dialogs có triển khai hộp thoại trình duyệt thư mục cho Windows Forms và WPF tương ứng.

nhập mô tả hình ảnh ở đây

Ookii.Dialogs.WinForms

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


Ookii.Dialogs.Wpf

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


tốt lưu ý: Ookii.Dialogs yêu cầu Microsoft .NET Framework 4.5 trở lên. (không thể được sử dụng trong WinXP)
S.Serpooshan

2
@ S.Serpooshan - Tôi đoán nó cũng không hoạt động trên PC Windows 3.1 của tôi, phải không? Nhưng nghiêm túc, vào năm 2018, dù sao đi nữa, không ai nên nghĩ về Windows XP - nó đã chết từ lâu.
rory.ap

@ rory.ap thực sự, vấn đề chính của giải pháp này đối với tôi là nó không hiển thị các tệp khi duyệt tìm thư mục. Đôi khi rất hữu ích để có thể xem các tệp (ví dụ: hình ảnh sẽ được xử lý) khi người dùng muốn chọn thư mục!
S.Serpoo Sơn

-5

đây phải là cách rõ ràng nhất và thẳng về phía trước

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đã được cung cấp ở đây nhiều lần, và là câu trả lời sai. Đó là một giao diện lỗi thời và rất thân thiện với người dùng. Nó sử dụng SHBrowseForFolderbên dưới và thậm chí cả trạng thái tài liệu "Đối với Windows Vista trở lên, bạn nên sử dụng IFileDialogvới FOS_PICKFOLDERStùy chọn thay vì SHBrowseForFolderchức năng. Điều này sử dụng hộp thoại Mở tệp trong chế độ chọn thư mục và là cài đặt ưu tiên."
Herohtar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.