programing

.NET의 동일한 대화 상자에서 파일 또는 폴더 선택

javajsp 2023. 5. 24. 21:43

.NET의 동일한 대화 상자에서 파일 또는 폴더 선택

동일한 대화 상자에서 파일 또는 폴더를 "쉽게" 선택할 수 있는 방법이 있습니까?

제가 만든 많은 앱에서 파일이나 폴더를 모두 입력할 수 있습니다.지금까지 저는 항상 파일 또는 폴더 선택 대화 상자를 전환하거나 드래그 앤 드롭 기능만 사용하는 스위치를 만들었습니다.

이것이 매우 기본적인 것처럼 보이기 때문에 나는 이것이 전에 만들어졌다고 생각하지만, 구글링은 많은 정보를 낳지 않습니다.따라서 처음부터 시작하여 사용자 지정 선택 대화 상자를 만들어야 할 것으로 보이지만, 이러한 사소한 작업을 위해 휠을 재창조함으로써 어떠한 문제도 소개하지는 않습니다.

팁이나 기존 솔루션이 있습니까?

UI를 일관되게 유지하려면 OpenFileDialog(또는 FolderBrowserDialog)를 확장할 수 있으면 좋겠습니다.

기술적으로, 그것은 가능합니다.FolderBrowseDialog에서 사용하는 셸 대화 상자에는 파일과 폴더를 모두 반환하는 기능이 있습니다.안타깝게도 이러한 기능은 .NET에서 노출되지 않습니다.반사조차 필요한 옵션 플래그를 찌를 수 없습니다.

작동하려면 BROWINFO.ulFlags(값 = 0x1200)에서 BIF_BROWSE INCLUDEFILES 플래그를 켠 상태에서 SHBrowseForFolder()를 P/Invoke해야 합니다.P/Invoke는 심각합니다. Reflector의 도움을 받아 다른 소스 또는 FolderBrowseDialog 클래스 자체에서 코드를 복사하여 붙여넣는 것이 가장 좋습니다.

위의 팁을 바탕으로 다음 위치에서 표준 폴더 브라우저 대화 상자를 사용하는 몇 가지 작동 코드를 찾았습니다. http://topic.csdn.net/t/20020703/05/845468.html

확장 폴더 브라우저의 클래스 대화 상자

Imports System   
Imports System.Text   
Imports System.Windows.Forms   
Imports System.Runtime.InteropServices   

Public Class DirectoryDialog 
    Public Structure BROWSEINFO 
        Public hWndOwner As IntPtr 
        Public pIDLRoot As Integer 
        Public pszDisplayName As String 
        Public lpszTitle As String 
        Public ulFlags As Integer 
        Public lpfnCallback As Integer 
        Public lParam As Integer 
        Public iImage As Integer 
    End Structure 

    Const MAX_PATH As Integer = 260

    Public Enum BrowseForTypes As Integer 
        Computers = 4096 
        Directories = 1 
        FilesAndDirectories = 16384 
        FileSystemAncestors = 8 
    End Enum 

    Declare Function CoTaskMemFree Lib "ole32" Alias "CoTaskMemFree" (ByVal hMem As IntPtr) As Integer 
    Declare Function lstrcat Lib "kernel32" Alias "lstrcat" (ByVal lpString1 As String, ByVal lpString2 As String) As IntPtr 
    Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolder" (ByRef lpbi As BROWSEINFO) As IntPtr 
    Declare Function SHGetPathFromIDList Lib "shell32" Alias "SHGetPathFromIDList" (ByVal pidList As IntPtr, ByVal lpBuffer As StringBuilder) As Integer 
    Protected Function RunDialog(ByVal hWndOwner As IntPtr) As Boolean 

        Dim udtBI As BROWSEINFO = New BROWSEINFO() 
        Dim lpIDList As IntPtr 
        Dim hTitle As GCHandle = GCHandle.Alloc(Title, GCHandleType.Pinned) 
        udtBI.hWndOwner = hWndOwner 
        udtBI.lpszTitle = Title 
        udtBI.ulFlags = BrowseFor 
        Dim buffer As StringBuilder = New StringBuilder(MAX_PATH) 
        buffer.Length = MAX_PATH 
        udtBI.pszDisplayName = buffer.ToString() 
        lpIDList = SHBrowseForFolder(udtBI) 
        hTitle.Free() 
        If lpIDList.ToInt64() <> 0 Then 
            If BrowseFor = BrowseForTypes.Computers Then 
                m_Selected = udtBI.pszDisplayName.Trim() 
            Else 
                Dim path As StringBuilder = New StringBuilder(MAX_PATH) 
                SHGetPathFromIDList(lpIDList, path) 
                m_Selected = path.ToString() 
            End If 
            CoTaskMemFree(lpIDList) 
        Else 
            Return False 
        End If 
        Return True 
    End Function 

    Public Function ShowDialog() As DialogResult 
        Return ShowDialog(Nothing) 
    End Function 

    Public Function ShowDialog(ByVal owner As IWin32Window) As DialogResult 
        Dim handle As IntPtr 
        If Not owner Is Nothing Then 
            handle = owner.Handle 
        Else 
            handle = IntPtr.Zero 
        End If 
        If RunDialog(handle) Then 
            Return DialogResult.OK 
        Else 
            Return DialogResult.Cancel 
        End If 
    End Function 

    Public Property Title() As String 
        Get 
            Return m_Title 
        End Get 
        Set(ByVal Value As String) 
            If Value Is DBNull.Value Then 
                Throw New ArgumentNullException() 
            End If 
            m_Title = Value 
        End Set 
    End Property

    Public ReadOnly Property Selected() As String 
        Get 
            Return m_Selected 
        End Get 
    End Property 

    Public Property BrowseFor() As BrowseForTypes
        Get 
            Return m_BrowseFor 
        End Get 
        Set(ByVal Value As BrowseForTypes) 
            m_BrowseFor = Value 
        End Set 
    End Property 

    Private m_BrowseFor As BrowseForTypes = BrowseForTypes.Directories 
    Private m_Title As String = "" 
    Private m_Selected As String = "" 

    Public Sub New() 
    End Sub
End Class 

확장 대화 상자를 구현하기 위한 코드

Sub Button1Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim frmd As DirectoryDialog = New DirectoryDialog()
    ' frmd.BrowseFor = DirectoryDialog.BrowseForTypes.Directories   
    ' frmd.BrowseFor = DirectoryDialog.BrowseForTypes.Computers   
    frmd.BrowseFor = DirectoryDialog.BrowseForTypes.FilesAndDirectories   
    frmd.Title = "Select a file or a folder"    
    If frmd.ShowDialog(Me) = DialogResult.OK Then   
        MsgBox(frmd.Selected)   
    End If   
End Sub

표준 OpenFileDialog를 사용하여 폴더를 선택할 수 있습니다.CodeProject에서 이를 수행하는 방법을 시연한 기사가 있습니다(http://www.codeproject.com/KB/dialog/OpenFileOrFolderDialog.aspx) .

그것은 된 적이 있다.FolderBrowserDialogEx를 사용할 수 있습니다. FolderBrowserDialogEx는 기본 제공되는 FolderBrowserDialog의 재사용 가능한 파생 제품입니다.이것을 사용하면 경로를 입력할 수 있습니다. UNC 경로도 입력할 수 있습니다.폴더 또는 파일+폴더를 찾아볼 수 있습니다.컴퓨터나 프린터를 검색할 수 있습니다.내장된 FBD를 기반으로 하지만... 더 낫습니다.유연성 향상.GUI에서 폴더를 클릭하면 텍스트 상자에 경로가 나타납니다.경로를 입력하면 폴더가 활성화됩니다.기본 제공 대화 상자에 부족한 옵션이 많습니다.

전체 소스 코드.무료. MS-Public 라이선스.

폴더브라우저 대화상자

사용할 코드:

     var dlg1 = new Ionic.Utils.FolderBrowserDialogEx();
     dlg1.Description = "Select a folder to extract to:";
     dlg1.ShowNewFolderButton = true;
     dlg1.ShowEditBox = true;
     //dlg1.NewStyle = false;
     dlg1.SelectedPath = txtExtractDirectory.Text;
     dlg1.ShowFullPathInEditBox = true;
     dlg1.RootFolder = System.Environment.SpecialFolder.MyComputer;

     // Show the FolderBrowserDialog.
     DialogResult result = dlg1.ShowDialog();
     if (result == DialogResult.OK)
     {
         txtExtractDirectory.Text = dlg1.SelectedPath;
     }

AFAIK, .NET 프레임워크에는 이를 즉시 수행하는 기능이 없습니다.

.NET 파일 대화 상자는 CommonDialog에서 파생됩니다.

ShowDialog를 호출하여 특정 공통 대화 상자를 만들어 RunDialog를 구현하려면 상속된 클래스가 필요합니다.상속된 클래스는 HookProc를 재정의하여 특정 대화 상자 후크 기능을 구현할 수 있습니다.

모든 기본 제공 대화 상자는 자신의 작업인 PrintDialog, OpenFileDialog, SaveFileDialog 등에 해당하는 셸 API를 사용합니다.

이 기능은 대부분 수동으로 구축해야 합니다.

http://www.pinvoke.net/default.aspx/shell32.shbrowseforfolder

만약 당신이 이 샘플에서 변경한다면 여기 gerat 링크가 있습니다.

  bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_SHAREABLE;

위해서

  bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_SHAREABLE | BIF_BROWSEINCLUDEFILES;

당신은 당신이 원하는 것을 얻을 것입니다.

특정 파일 형식만 표시하려면 다음 문서(C#의 소스 코드 포함)를 참조하십시오.

http://www.codeproject.com/KB/shell/csdoesshell1.aspx?fid=14137&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26

또한 폴더 브라우저 대화상자를 "사용자 정의"하기 위해 사용할 수 있는 다른 옵션에 대해서도 설명합니다.

이렇게 하면 OpenFileDialog를 사용하여 폴더를 선택할 수 있습니다.

        openFileDialog1.CheckFileExists = false;
        openFileDialog1.ValidateNames = false;

Ookii 대화 상자는 파일 또는 폴더를 입력으로 모두 허용하는 폴더 브라우저 대화 상자를 구현하며 Windows Forms 및 WPF에서 사용할 수 있습니다.

여기에 이미지 설명 입력

좋아요, 대화.Wpf

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


좋아요, 대화.WinForms

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

언급URL : https://stackoverflow.com/questions/428410/select-either-a-file-or-folder-from-the-same-dialog-in-net