我用如下代码实现多选
file5.Flags = cdlOFNAllowMultiselect + cdlOFNExplorer
file5.Filter = "All Files|*.*"
file5.FileName = ""
file5.ShowOpen
msgbox(file5.filename)可为什么当只选一个文件的时候能显示正常,而当多选的时候 就只显示当前文件所在路径?
可用 len(file5.filename) 的时候,长度倒是不断增加?
file5.Flags = cdlOFNAllowMultiselect + cdlOFNExplorer
file5.Filter = "All Files|*.*"
file5.FileName = ""
file5.ShowOpen
msgbox(file5.filename)可为什么当只选一个文件的时候能显示正常,而当多选的时候 就只显示当前文件所在路径?
可用 len(file5.filename) 的时候,长度倒是不断增加?
CommonDialog1.FileName = ""
CommonDialog1.Filter = "bmp files(*.bmp)|*.bmp|jpg files(*.jpg)|*.jpg|all files(*.*)|*.*"
CommonDialog1.Flags = cdlOFNAllowMultiselect Or cdlOFNExplorer
CommonDialog1.Action = 1
Dim s As String
s = CommonDialog1.FileName
Dim arr
arr = Split(s, Chr(0))
Dim path As String
Dim file1 As String
Dim i As Long
i = InStrRev(arr(0), "\")
List1.Clear
If i > 0 Then
'path = Left(arr(0), i - 1)
path = IIf(Right(arr(0), 1) = "\", arr(0), arr(0) & "\")
If UBound(arr) >= 1 Then
For i = 1 To UBound(arr)
List1.AddItem path + arr(i)
Next
Else
List1.AddItem s
End If
End If
End Sub
在模块ModDlgSelectFileInfo中,然后在窗体中加一个listbox,一个Command,看看这个例子比较方便.ption Explicit
'包含函数: GetDlgSelectFileInfo
'函数功能: 获取从CommonDialog中选取的文件信息
'自定义类型,用于DlgSelectFileInfo函数
Type DlgFileInfo
iCount As Long
sPath As String
sFile() As String
End Type'功能: 返回CommonDialog所选择的文件数量和文件名
'参数说明: strFileName是CommonDialog.Filename
'函数类型: DlgFileInfo。这是一个自定义类型,声明如下:
' Type DlgFileInfo
' iCount As Long
' sPath As String
' sFile() As String
' End Type
' 其中,iCount为选择文件的数量,sPath为所选文件的路径,sFile()为所选择的文件名
'注意事项: 在CommonDialog.ShowOpen后立即使用,以免当前路径被更改
' 在打开了*.pif文件后须将Filename属性置空,否则当选取多个*.pif文件后,当前路径会改变会
' 在CommonDialong.Flags属性中使用cdlOFNNoDereferenceLinks风格,就可以正确的返回*.pif文件的文件名了Public Function GetDlgSelectFileInfo(strFilename As String) As DlgFileInfo
'思路: 用CommonDialog控件选择文件后,其Filename属性值如下:
' 1、如果选择的是"C:\Test.txt", Filename="C:\Test.txt", CurDir()="C:\"
' 2、如果选择的是"C:\1\Test.txt",Filename="C:\1\Test.txt", CurDir()="C:\1"
' 3、如果选择的是"C:\1.txt"和"C:\2.txt",则:
' Filename="C:\1 1.txt 2.txt", CurDir()="C:\1"
' 因此先将路径分离开,再利用多文件之间插入的Chr$(0)字符分解各个文件名即可。
Dim sPath, tmpStr As String
Dim sFile() As String
Dim iCount As Integer
Dim I As Integer
On Error GoTo ErrHandle
sPath = CurDir() '获得当前的路径,因为在CommonDialog中改变路径时会改变当前的Path
tmpStr = Right$(strFilename, Len(strFilename) - Len(sPath)) '将文件名分离出来
If Left$(tmpStr, 1) = Chr$(0) Then
'选择了多个文件(表现为第一个字符为空格)
For I = 1 To Len(tmpStr)
If Mid$(tmpStr, I, 1) = Chr$(0) Then
iCount = iCount + 1
ReDim Preserve sFile(iCount)
Else
sFile(iCount) = sFile(iCount) & Mid$(tmpStr, I, 1)
End If
Next I
Else
'只选择了一个文件(注意:根目录下的文件名除去路径后没有"\")
iCount = 1
ReDim Preserve sFile(iCount)
If Left$(tmpStr, 1) = "\" Then tmpStr = Right$(tmpStr, Len(tmpStr) - 1)
sFile(iCount) = tmpStr
End If
GetDlgSelectFileInfo.iCount = iCount
ReDim GetDlgSelectFileInfo.sFile(iCount)
If Right$(sPath, 1) <> "\" Then sPath = sPath & "\"
GetDlgSelectFileInfo.sPath = sPath
For I = 1 To iCount
GetDlgSelectFileInfo.sFile(I) = sFile(I)
Next I
Exit FunctionErrHandle:
MsgBox "GetDlgSelectFileInfo函数执行错误!", vbOKOnly + vbCritical, "自定义函数错误"End Function
'//窗体中的代码
Private Sub Command1_Click()
Dim DlgInfo As DlgFileInfo
Dim I As Integer
On Error GoTo ErrHandle
'清除List1中的项
List1.Clear
'选择文件
With CommonDialog1
.CancelError = True
.MaxFileSize = 32767 '被打开的文件名尺寸设置为最大,即32K
.Flags = cdlOFNHideReadOnly Or cdlOFNAllowMultiselect Or cdlOFNExplorer Or cdlOFNNoDereferenceLinks
.DialogTitle = "选择文件"
.Filter = "所有类型的文件(*.*)|*.*"
.ShowOpen
DlgInfo = GetDlgSelectFileInfo(.FileName)
.FileName = "" '在打开了*.pif文件后须将Filename属性置空,
'否则当选取多个*.pif文件后,当前路径会改变
End With
Dim Serial As Integer
Serial = Form1.List1.ListCount + 1
For I = 1 To DlgInfo.iCount
List1.AddItem Serial & "." & DlgInfo.sPath & DlgInfo.sFile(I)
Serial = Serial + 1
Next I
Exit Sub
ErrHandle:
' 按了“取消”按钮
End Sub