VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 通用对话框的同时打开多文件的方法
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:11029, 日期:2001-01-03
`准备一个Command、List。
`思路是根据在多选时返回值的特点
`如在C:\Programe Files中选择两个文本文件:"Your Friend.txt"、"My Friend.txt"
`则返回值为:"C:\Programe Files Your Friend.txt My Friend.txt"
`中间用Null分开,据此往下看。
Option Explicit

` GetMultiFiles 过程从多选对话框返回的字符串中获得文件路径及各个文件名。
`   入口参数:
`       FileName    -- 多选对话框返回的含有多个文件名的字符串。
`       strPath      -- 从FileName中获得的路径。
`       strFileName() -- 从FileName中获得的各个文件名,以数组形式返回。
Public Sub GetMultiFiles(ByVal FileName As String, _
                strPath As String, strFileName() As String)
    
        Dim strMultiFilename As String
        Dim lngFileLength As Long
        Dim intNullPos As Integer
        Dim i As Integer

        intNullPos = InStr(1, FileName, vbNullChar)
        ` 如果intNullPos = 0,则表示只传递过来一个文件。
        If intNullPos = 0 Then
            ReDim Preserve strFileName(0) As String
            ` 获得文件名。
            strFileName(0) = Dir(FileName, vbDirectory)
            ` 减1是为了将文件路径和文件名之间的分隔符去掉。
            lngFileLength = Len(FileName) - Len(strFileName(0)) - 1
            ` 获得文件所在的路径。
            strPath = Left(FileName, lngFileLength)
            Exit Sub
        End If
        
        ` 获得去掉文件路径后的多文件名组成的字符串长度。
        lngFileLength = Len(FileName) - intNullPos
        ` 获得多个文件名组成的字符串。
        strMultiFilename = Right(FileName, lngFileLength)
        
        ` 获得文件所在的路径。
        strPath = Left(FileName, intNullPos - 1)
            
        ` 此语句用于下面的循环语句。
        intNullPos = InStr(1, strMultiFilename, vbNullChar)

        ` 只要intNullPos不等于零,
        `    则表示多个文件名的变量strMultiFilename中有空字符存在,
        `    暗示strMultiFilename还有两个以上的文件名。
        i = 0
        Do While intNullPos > 0
            
            ` 重新定义动态数组。
            ReDim Preserve strFileName(i) As String
            ` 从strMultiFilename中获得文件名。
            strFileName(i) = Left(strMultiFilename, intNullPos - 1)
            ` 从strMultiFilename中去掉已提取的文件后所得的字符串长度。
            lngFileLength = Len(strMultiFilename) - intNullPos
            ` 将strFileName(i)从strMultiFilename中去掉,
            `   从而重新获得strMultiFilename的值。
            strMultiFilename = Right(strMultiFilename, lngFileLength)
            ` 重新检查strMultiFilename变量是否有空字符。
            intNullPos = InStr(1, strMultiFilename, vbNullChar)
            i = i + 1
        Loop
        ` 当第一次获得intNullPos为零时,仍有一个文件名没有被提取出来。
        ReDim Preserve strFileName(i) As String
        strFileName(i) = strMultiFilename

End Sub
``````````````````````窗体代码
Private Sub Command1_Click()
    ` 设置CancelError为True。
    With CommonDialog1
        .CancelError = True
        On Error GoTo ErrHandler

        ` 设置过滤条件。
        .Filter = "所有文件 (*.*)|*.*|文本文件" & _
                            "(*.txt)|*.txt|批文件 (*.bat)|*.bat"
        ` 指定缺省的过滤条件索引。
        .FilterIndex = 2

        ` 此“打开”对话框具有类似于资源管理器的对话框模板,
        ` 支持长文件名和多重选择,并显示“帮助”按钮。
        .Flags = cdlOFNExplorer Or _
                cdlOFNLongNames Or _
                cdlOFNAllowMultiselect Or _
                cdlOFNHelpButton

        ` 显示“打开”对话框。
        .ShowOpen
        Dim strPath As String
        Dim strFileName() As String
        ` 调用GetMultiFiles方法,以获得文件的路径和文件名。
        Call GetMultiFiles(.FileName, strPath, strFileName())
        ` 清除列表框。
        List1.Clear
        ` 将通用对话框返回的文件字符串加入到列表框中。
        List1.AddItem .FileName
        ` 在列表框中插入一空行。
        List1.AddItem ""
    End With
    
    Dim i As Integer
    ` 通过下列循环将文件名及其全路径加入到列表框中。
    For i = LBound(strFileName) To UBound(strFileName)
        List1.AddItem strPath & "\" & strFileName(i)
    Next i
    Exit Sub
    
ErrHandler:
    ` 用户按了“取消”按钮。
    Exit Sub

End Sub

Private Sub Form_Load()
    Command1.Caption = "打开文件"
End Sub