OpenFileDialog를 사용하여 폴더를 선택하는 방법은 무엇입니까?


296

OpenFileDialog폴더를 선택 하는 방법 ?

다음 프로젝트를 사용하려고했습니다 : https://github.com/scottwis/OpenFileOrFolderDialog

그러나 나는 한 가지 문제에 직면했다. GetOpenFileName기능과 OPENFILENAME구조를 사용합니다 . 그리고 OPENFILENAME라는 멤버가 templateID있습니다. 대화 상자 템플릿의 식별자입니다. 그리고 프로젝트에는 res1.rc파일과 템플릿 대화 상자 가 포함되어 있습니다. 그러나이 파일을 C # 프로젝트에 첨부하는 방법을 알 수 없었습니다.

를 사용하여 OpenFileDialog폴더를 선택 하는 더 좋은 방법이 있습니까?


편집기로 프로젝트 파일을 열면 하단에 <VCIncludePath ...>, <Win32Resource ...> 및 <Target Name = "BeforeBuild"...>와 같은 추가 속성이 표시됩니다. 리소스 파일 res1.rc를 컴파일하기 위해 rc.exe를 실행하는 것을 볼 수 있습니다 ( "resource.h"도 프로젝트에 복사하십시오). VisualC가 설치되어 있고 VCIncludePath가 올바른 위치를 가리키는 지 확인하십시오 (github는 VC9.0 버전 중 하나이므로 변경해야 할 수도 있습니다). .rc 파일을 컴파일 한 후 결과 .res 파일이 Win32Resource 지시문으로 실행 파일의 리소스로 추가됩니다.
mistika 2016 년

3
OpenFileDialog를 사용하여 hackish 솔루션이 ValidateNamesCheckFileExistsfalse로 모두 설정을하고 FileName디렉토리가 선택되어 있는지 표시하기 위해 모의 값이 기재되어 있습니다. 폴더를 선택하는 방법에 대해 사용자에게 혼란을주기 때문에 해킹이라고 말합니다. 같은 대화 상자에서 파일 또는 폴더 선택
Daniel Ballinger를

1
OpenFileDialog-Hack을 가리키는 감사합니다! OFD는 북마크 된 폴더 등을 표시하므로 특히 대기업의 모든 사람들이 자신의 쓰레기를 발견하기 때문에 FolderBrowserDialog보다 훨씬 좋습니다. FBD는 그 장소에서별로 좋지 않습니다.
JayC667

1
@ComradeJoecool 내 의견을 답변으로 변환했습니다 . 여러 번 시도했지만 "파일을 찾을 수 없음"문제가 없습니다. 동일한 OpenFileDialog 인스턴스를 재사용하고 있습니까?
Daniel Ballinger

1
나는 대화 상자를 만들 PowerShell을 사용하여 설정하고 있기 때문에 아 @DanielBallinger, 나는 내 문제를 발견 ValidateNames하고 CheckFileExists위해 false작동하지 않는, 내가 그들을 설정하는 데 필요한 0(또는 PowerShell을 더 알아보기)
ComradeJoecool

답변:


398

기본적으로 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의 유용성이 부족합니다. 가장 큰 단점은 빠른 탐색을 위해 Windows 탐색기에서 폴더 경로를 복사 할 수 없으므로 3 개 이상의 수준을 드릴 다운해야 할 때 쓸모가 없다는 것입니다. 특히 저장 속도가 느리거나 레벨 중 하나에 폴더가 많은 경우 각 폴더에 대한 드릴 작업은 바람직하지 않습니다.
mistika 2016 년

2
이 문제는 특히 FBD (FolderBrowserDialog)가 아니라 OFD (OpenFileDialog)를 사용하여 폴더를 선택하는 것에 관한 것입니다. FBD가 사용자 관점에서 끔찍하다고 동의합니다.
Michael Paulukonis

25
UI가 깨진이 대화 상자 대신 CommonOpenFileDialog를 사용 하십시오 new CommonOpenFileDialog { IsFolderPicker = true }.
ANeves

113
제발, 지금까지 사용하지 마십시오 ! 나는 사용자 로서이 끔찍한 트리보기 대화 상자 (FolderBrowserDialog)로 또 다른 응용 프로그램을 만든이 가난한 프로그래머를 비난했다는 것을 기억 합니다. 루트 디렉토리, 즐겨 찾기 패널 누락 및 가장 끔찍한 루트 다이어는 완전히 사용할 수 없습니다. 경로를 붙여 넣을 수도 없습니다! 그리고 지금 프로그래머로서 나는 그것을 사용하기위한 조언을 봅니다… 제발,하지 마십시오.
Hi-Angel

2
FolderBrowserDialog에는 다른 사용자가 말한 것 외에 하나의 큰 결함이 있습니다. 마지막으로 선택한 경로를 기억하지 않습니다!
AleX_

252

을 사용하지 않으려는 향후 사용자를위한 참고 사항으로 FolderBrowserDialogMicrosoft는 유용한 대화 상자가있는 WindowsAPICodePack이라는 API를 릴리스했습니다.이 API CommonOpenFileDialogIsFolderPicker모드 로 설정할 수 있습니다 . 이 API는 Microsoft에서 NuGet 패키지로 제공 됩니다.

이것이 설치 및 사용에 필요한 전부 CommonOpenFileDialog입니다. (NuGet은 종속성을 처리했습니다)

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

36
이것이 "OpenFileDialog를 사용하여 폴더를 선택하는 방법"에 대한 가장 가까운 대답이라고 생각합니다. FolderBrowseDialog는 매우 사용할 수 없습니다. 이 답변에 감사드립니다.
Koray

46
이것이 답이되어야합니다. 그리고 Microsoft.WindowsAPICodePack.Shell이것을 사용하려면 NuGet을 통해 패키지 를 설치해야합니다 CommonOpenFileDialog.
smwikipedia 3

1
VS2017과 함께 사용하면 기본 창의 스타일이 변경됩니다.
Lokiare

1
FolderBrowserDialog사용자 참고 사항 : 인스턴스를 여러 번 동시에 사용하면 문제가 발생할 수 있습니다. 이게 CommonOpenFileDialog더 낫다
Alper

9
Microsoft는 다음과 같이 다시 게시 한 것 같습니다WindowsAPICodePack-Shell
NucS

32

이 사용 hackish 솔루션 OpenFileDialogValidateNames과는 CheckFileExistsfalse로 두 세트되고 FileName디렉토리가 선택되어 있는지 표시하기 위해 모의 값이 부여됩니다.

폴더를 선택하는 방법에 대해 사용자에게 혼란을주기 때문에 해킹이라고 말합니다. 원하는 폴더에 있어야하며 파일 이름에 "폴더 선택"이라고 표시된 상태에서 열기를 누르면됩니다.

C # 폴더 선택 대화 상자

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

그렇습니다, 나는 그것을 작동 시켰습니다. 한 가지 성가신 것은 Folder Selection.파일 이름 끝에 다음과 같이 고정되는 것입니다 C:\Folder Selection.. 문자열에서 해당 문자를 항상 제거 할 수 있다고 생각합니다. 아직도 FolderBrowserDialog보다 더 나은 모습
ComradeJoecool

이것은 나를 위해 작동하지 않습니다. 폴더를 선택할 수 없습니다. 그냥 엽니 다.
Lokiare

1
@Lokiare 그것이 내가 핵이라고 말했을 때의 의미입니다. 두 번째 단락의 지침을 참조하십시오.
Daniel Ballinger

2
@ComradeJoecool 수동으로 수동으로 제거하지 않아도됩니다. 코드의 마지막 줄은 다음과 같습니다. string folderPath = Path.GetDirectoryName (folderBrowser.FileName);
Heriberto Lugo

오! 이 방법에 문제가 있습니다 : 사용자 프레스는 경우 위로 또는 뒤로 버튼을 사용하여 폴더를 탐색, 주요 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 답변 사이에 차이가 있습니까?
Chetan Mehra

1
논리는 동일하지만 내 대답은 훨씬 짧으며 DialogResult에 추가 변수를 만들 필요가 없습니다.
Andrew

2
이미 언급했듯이이 방법에는 몇 가지 큰 문제가 있습니다. 이것은 끔찍한 트리보기 대화 상자입니다! 경로를 복사하여 붙여 넣을 수 없으며 루트 폴더에서 하나씩 드릴해야하며 즐겨 찾기 패널이 없습니다!
S.Serpooshan

@ S.Serpooshan은 중요하지 않습니다. 이것은 모든 대화 상자 사용 샘플입니다. 원하는 경우 다른 대화 상자를 사용할 수 있습니다. :)
Andrew

9

FolderBrowserDialog 바로 뒤에있는 것처럼 들립니다 .


5
FolderBrowserDialog에 끔찍한 유용성이 있고 OP가 명시 적으로 OpenFileDialog를 사용하고 싶었습니다.
mbx

3
@mbx 아마도. 공정하게 말해서 OP는 "OpenFileDialog 외에는 아무것도 사용할 수 없습니다"라고 말하지 않습니다. 내가 원래 4 년 반 전에 대답했을 때 OP는 사용자가 폴더를 여는 방법을 알지 못한다고 가정했습니다. 이 답변을 게시 한 후에 실제로이 질문으로 돌아 가지 않았으므로 사용성에 관한 토론을 보지 못했으며 대답 할 때 고려하지 않았습니다.
Simon Whitehead

6

여기에 하나의 간단한 ZIP 파일로 모든 소스를 사용할 수있는 또 다른 솔루션이 있습니다.

OpenFileDialog에 Windows 7+ 폴더 선택 대화 상자처럼 작동하도록하는 추가 Windows 플래그가 표시됩니다.

웹 사이트에 따르면, 그것은 공개 도메인입니다 : "당신이 원하는 코드를 가지고 자유롭게 할 수있는 라이센스는 없습니다."

Archive.org 링크 :


1
완벽하게 작동하십시오!. 또한 "FolderSelectDialog.cs"에 다음 줄을 추가하여 여러 폴더를 선택할 수 있습니다. public string [] FileNames {get {return ofd.FileNames; }} 및 변경 ofd.Multiselect = true; 생성자
Maxter

5

Windows Forms 및 WPF에 대한 폴더 브라우저 대화 상자가 각각 구현 된 Ookii 대화 상자 라이브러리를 살펴보십시오 .

여기에 이미지 설명을 입력하십시오

Ookii.Dialogs.WinForms

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


Ookii.Dialogs.Wpf

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


좋은. 참고 : Ookii.Dialogs에는 Microsoft .NET Framework 4.5 이상이 필요합니다. (WinXP에서는 사용할 수 없음)
S.Serpooshan

2
@ S.Serpooshan-Windows 3.1 PC에서도 작동하지 않는 것 같습니다. 그러나 2018 년에는 Windows XP에 대해 아무도 생각하지 않아야합니다.
rory.ap 오전

@ rory.ap 실제로,이 솔루션의 주요 문제는 폴더를 탐색 할 때 파일을 표시하지 않는다는 것입니다. 사용자가 폴더를 선택하려고 할 때 파일 (예 : 처리 될 이미지)을 볼 수 있으면 매우 유용합니다!
S.Serpooshan

-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아래, 심지어 워드 프로세서 상태 "Windows Vista의 이상, 당신이 사용하는 것이 좋습니다 IFileDialogFOS_PICKFOLDERS오히려보다는 옵션 SHBrowseForFolder. 기능이 사용 픽업 폴더 모드에서 파일 열기 대화 상자 및 선호 구현 한 것입니다."
Herohtar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.