分享

如何遍历文件夹及其子文件夹中所有指定的文件?

 JT_man 2015-12-20


    本代码可以在指定文件夹及其所有子文件夹中,查找全部指定类型的文件(如 *.xls*),或者与指定类型匹配的文件(如 ????.xls),也可以查找单个文件(如 ABC.doc、ABC.txt)。

    代码来自ExcelHome网站,本人收录时作了部分修改。经测试,查找D:\所有Excel文件与运行DOS命令:

    dir d:\*.xls* /s/b/a-d>d:\1.txt
    start d:\1.txt

    结果一致。

    代码如下:

Sub FindAllFiles()
    '在指定文件夹及其所有子文件夹中,查找全部指定类型的文件(如 *.xls*),
    '或者与指定类型匹配的文件(如 ????.xls),也可以查找单个文件(如 ABC.doc)。
    Dim sFolder As String, PathDic As Object, FileDic As Object, ErrDic As Object, _
        I As Long, iTime As Single, bHave As Boolean, sFileName As String, _
        sMyPath As String, sMyType As String, objShell, objFolde, Arr, tmpPath, SH, _
        bErrList As Boolean
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.BrowseForFolder(0, "选择文件夹", 0, 0)
    If objFolder Is Nothing Then
        Exit Sub
    Else
        sMyPath = objFolder.self.Path
        If Right(sMyPath, 1) <> "\" Then
            sMyPath = sMyPath & "\"
        End If
    End If
    sMyType = InputBox("请输入查找文件类型或单个文件名称:" & vbCrLf & vbCrLf & _
        "比如:*.xls* 、*.doc 、ABC.xls 、?????.*", "文件类型或单个文件", "*.xls*")
    If sMyType = "" Then
        Exit Sub
    End If
    Set objFolder = Nothing
    Set objShell = Nothing
    bErrList = False  '如果要显示出错文件夹,请把值改为 True
    
    Application.StatusBar = "正在查找,请等待..."
    iTime = Timer
    Set PathDic = CreateObject("Scripting.Dictionary")
    Set FileDic = CreateObject("Scripting.Dictionary")
    Set ErrDic = CreateObject("Scripting.Dictionary")
    ErrDic.Add "出错文件夹", ""
    PathDic.Add sMyPath, ""
    
    '有些文件夹会出错,但这个文件夹中的相应文件仍能找出来
    On Error Resume Next
    
    I = 0
    Do While I < PathDic.Count
        Arr = PathDic.keys
        sFolder = Dir(Arr(I), vbDirectory)
        Do While sFolder <> ""
            '排除掉当前目录(.)和父目录(..)
            If sFolder <> "." And sFolder <> ".." Then
                '有些文件夹这里会出错
                '如果是次级目录
                If (GetAttr(Arr(I) & sFolder) And vbDirectory) = vbDirectory Then
                    If Err.Number <> 0 Then
                        Err.Clear
                        If bErrList Then
                            ErrDic.Add (Arr(I) & sFolderr), ""
                            'Err.Clear  '放在这里会导致查找结果不全
                        End If
                    Else
                        PathDic.Add (Arr(I) & sFolder & "\"), ""
                    End If
                End If
            End If
            sFolder = Dir
        Loop
        I = I + 1
    Loop
    
    On Error GoTo 0
    FileDic.Add ("文件清单【文件夹“" & sMyPath & "”及其所有子文件夹中“" & sMyType & "”】"), ""
    For Each tmpPath In PathDic.keys
        sFileName = Dir(tmpPath & sMyType)
        Do While sFileName <> ""
            
            '如果查找文件类型类似?????.*,必须加下面这行代码
            'If sFileName Like sMyType Then   '文件名及扩展名区分大小写(如*.xls与*.XLS不能同时查出来)
            If UCase(sFileName) Like UCase(sMyType) Then   '文件名及扩展名不区分大小写
                                        
                FileDic.Add (tmpPath & sFileName), ""
            End If
            sFileName = Dir
        Loop
    Next
    For Each SH In ThisWorkbook.Worksheets
        If SH.Name = "查找结果" Then
            Sheets("查找结果").Cells.ClearContents
            bHave = True
            Exit For
        End If
    Next
    If Not bHave Then
        Sheets.Add.Name = "查找结果"
    End If
    I = 1
    If bErrList And ErrDic.Count > 1 Then
        Sheets("查找结果").[A1].Resize(ErrDic.Count, 1) = WorksheetFunction.Transpose(ErrDic.keys)
        I = ErrDic.Count + 2
    End If
    Sheets("查找结果").Range("A" & I).Resize(FileDic.Count, 1) = WorksheetFunction.Transpose(FileDic.keys)
    Sheets("查找结果").Select
    Sheets("查找结果").[A1].Select
    iTime = Timer - iTime
    
    Application.StatusBar = False
    MsgBox "查找结束,用时" & Round(iTime, 0) & "秒。"
End Sub


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多