我们前面的课程学习过ShowOpen方法,可以很方便的在对话框内,选择一个或者多个文件,并获取文件的路径。
但是,如果需要获取一个文件夹路径,那么使用ShowOpen方法是无法办到的,那么该如何实现呢?
步骤一:
建立一个窗体和一个按钮,如下所示:
步骤二:
进入代码编辑器,编写如下所示代码:
Option ExplicitPrivate Type BrowseInfo hWndOwner As Long pIDLRoot As Long pszDisplayName As Long lpszTitle As Long ulFlags As Long lpfnCallback As Long lParam As Long iImage As LongEnd TypeConst BIF_RETURNONLYFSDIRS = 1Const BIF_NEWDIALOGSTYLE = &H40Const BIF_EDITBOX = &H10Const BIF_USENEWUI = BIF_NEWDIALOGSTYLE Or BIF_EDITBOXConst MAX_PATH = 260Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As LongPrivate Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As LongPrivate Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As LongPublic Function BrowseForFolder(Optional sTitle As String = "请选择文件夹") As String Dim iNull As Integer, lpIDList As Long, lResult As Long Dim sPath As String, udtBI As BrowseInfo With udtBI .hWndOwner = 0 ' Me.hWnd .lpszTitle = lstrcat(sTitle, "") .ulFlags = BIF_RETURNONLYFSDIRS Or BIF_USENEWUI End With lpIDList = SHBrowseForFolder(udtBI) If lpIDList Then sPath = String$(MAX_PATH, 0) SHGetPathFromIDList lpIDList, sPath CoTaskMemFree lpIDList iNull = InStr(sPath, vbNullChar) If iNull Then sPath = Left$(sPath, iNull - 1) End If End If BrowseForFolder = sPathEnd FunctionPrivate Sub Command1_Click() '调用函数,并显示其返回结果 MsgBox BrowseForFolder()End Sub
注意: 1,本代码用到API,相对复杂,可以直接复制所有代码进行测试。 2,"请选择文件夹"中的文字可以自行定义,其将会在对话框中作为提示性的文本,提示用户操作。 步骤三: 运行程序,点击按钮,则进入浏览文件夹的对话框,选择一个文件夹后,单击确认按钮。
步骤四: 代码将获取到用户选择的文件夹路径后,返回其路径字符串。
该方法还可以在浏览文件夹对话框时,新建文件夹。对于需要用户选择一个文件夹,并获取用户选择的文件夹路径,利用这个方法是相当的不错的。只是代码用到API还是比较麻烦的,不方便记忆和理解,因此建议小伙伴们可以收藏起来,以后用到的时候直接复制粘贴即可。