真不好意思提这个问题,要说写中间过程自己已经写出来了,就是这脑袋对于圈套一类的这些东西实在是想像不出来,自己调了一下网上的这类程序但发觉不好改动,自己写列一层目录OK,归递就卡死。。
其实我的想法很简单就是一个想写一个模块出来跟我以前写的分块校验配合使用。
只要朋友们给我们基本的框架就OK了。因为这个不需要太讲究效率所以不用API也没啥。
用归递列出一个指定路径下的所有文件及空目录,网上的可以照要求列出文件但列不出空目录我自己写的代码一遇空目录就。卡死了
格式如下
/'这是第一层也就是当前根目录
/1/123.123
/1/321.321
/2/444.444
/3/'这是空目录
就是上面的意思了。

解决方案 »

  1.   

    大概是这样的一个递归函数:sub 函数(某目录)
      列出某目录中的所有文件
      for each 子目录 in 某目录  do
        函数(子目录)
      end for
    end sub
      

  2.   

    请看这篇文章
    http://blog.csdn.net/chenhui530/archive/2007/10/03/1810299.aspx
      

  3.   

    这是我以前收藏的一个如何实现遍历文件夹中的所有文件 把下面放到模块中
    Option ExplicitPublic Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" _
    (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
    Public Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" _
    (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
    Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As LongPublic Const MAX_PATH = 260
    Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
    Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
    Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
    Public Const FILE_ATTRIBUTE_HIDDEN = &H2
    Public Const FILE_ATTRIBUTE_NORMAL = &H80
    Public Const FILE_ATTRIBUTE_READONLY = &H1
    Public Const FILE_ATTRIBUTE_SYSTEM = &H4
    Public Const FILE_ATTRIBUTE_TEMPORARY = &H100'自定义数据类型FILETIME和WIN32_FIND_DATA的定义
    Public Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
    End TypePublic Type WIN32_FIND_DATA
        dwFileAttributes As Long
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME
        ftLastWriteTime As FILETIME
        nFileSizeHigh As Long
        nFileSizeLow As Long
        dwReserved0 As Long
        dwReserved1 As Long
        cFileName As String * MAX_PATH
        cAlternate As String * 14
    End Type
    '----------------------
    '--------------------------------------------------------------------------------
    '           把当前文件夹路径下的所有文件入到listview中
    '--------------------------------------------------------------------------------
    Private Sub finfiles(tCurrentdir As String)
        Dim itmX As ListItem
        Dim tFindData As WIN32_FIND_DATA
        Dim strFileName As String
        Dim lHandle As Long
        Dim CountFolder As Integer
        Dim CountFiles As Integer
        CountFolder = 0
        CountFiles = 0
        ListView1.ListItems.Clear
        lHandle = FindFirstFile(tCurrentdir & "\*.*", tFindData)
        If lHandle = 0 Then
           Set itmX = ListView1.ListItems.Add(, , strFileName & "找不到文件")
           Exit Sub
        End If
       strFileName = fDelInvaildChr(tFindData.cFileName)
       Do While True
            tFindData.cFileName = ""
            If FindNextFile(lHandle, tFindData) = 0 Then
                FindClose (lHandle)
                Exit Do
            Else
                strFileName = fDelInvaildChr(tFindData.cFileName)
                If tFindData.dwFileAttributes = &H10 Then
                    If strFileName <> "." And strFileName <> "." Then
                        Set itmX = ListView1.ListItems.Add(, , strFileName)
                        itmX.SmallIcon = 1
                        CountFolder = CountFolder + 1
                    End If
                Else
                    Debug.Print InStr(LCase(Right(strFileName, 3)), ExtendFileName)
                    If InStr(ExtendFileName, LCase(Right(strFileName, 3))) > 0 Then
                        Set itmX = ListView1.ListItems.Add(, , strFileName)
                        itmX.SubItems(1) = CStr(FileLen(tCurrentdir & "\" & strFileName))
                        itmX.SmallIcon = 2
                        itmX.SubItems(2) = FileDateTime(tCurrentdir & "\" & strFileName)
                        CountFiles = CountFiles + 1
                    End If
                End If
            End If
        Loop
        ListView1.Sorted = True
        ListView1.SortKey = 1
        StatusBar1.Panels(2).Text = CurrentDir
        StatusBar1.Panels(3).Text = "文件夹:" & CountFolder & "  文件:" & CountFiles
    End Sub
      

  4.   

    这是收藏的另一个用API函数遍历指定驱动器、目录的文件以下代码演示了如何用Windows API函数遍历指定驱动器、目录的所有文件。
    其思路是:调出浏览文件夹窗口让用户指定所要搜索的起始路径,然后用查找文件的API函数遍历该目录下及其包含的子目录下的所有文件。
    本例需要:一个按钮,一个TextBox和一个ListBox,其中,TextBox应设置为多行。
    核心代码参照API-Guide的两个例子程序,特此声明。Option Explicit'查找第一个文件的API
    Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
    '查找下一个文件的API
    Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
    '获取文件属性的API
    Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
    '关闭查找文件的API
    Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
    '以下为调用浏览文件夹窗口的API
    Private 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 Long
    Private Declare Function SHBrowseForFolder Lib "shell32" (lPBi As BrowseInfo) As Long
    Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long'常量
    Const MAX_PATH = 260
    Const MAXDWORD = &HFFFF
    Const INVALID_HANDLE_VALUE = -1
    Const FILE_ATTRIBUTE_ARCHIVE = &H20
    Const FILE_ATTRIBUTE_DIRECTORY = &H10
    Const FILE_ATTRIBUTE_HIDDEN = &H2
    Const FILE_ATTRIBUTE_NORMAL = &H80
    Const FILE_ATTRIBUTE_READONLY = &H1
    Const FILE_ATTRIBUTE_SYSTEM = &H4
    Const FILE_ATTRIBUTE_TEMPORARY = &H100
    Const BIF_RETURNONLYFSDIRS = 1
    Private Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
    End Type'定义类(用于查找文件)
    Private Type WIN32_FIND_DATA
        dwFileAttributes As Long
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME
        ftLastWriteTime As FILETIME
        nFileSizeHigh As Long
        nFileSizeLow As Long
        dwReserved0 As Long
        dwReserved1 As Long
        cFileName As String * MAX_PATH
        cAlternate As String * 14
    End Type'定义类(用于浏览文件夹窗口)
    Private 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 Long
    End Type'自定义函数
    Function StripNulls(OriginalStr As String) As String
        If (InStr(OriginalStr, Chr(0)) > 0) Then
            OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
        End If
        StripNulls = OriginalStr
    End Function'自定义函数
    Function FindFileSAPI(path As String, SearchStr As String, FileCount As Integer, _
        DirCount As Integer)
        Dim FileName As String ' 文件名
        Dim DirName As String ' 子目录名
        Dim dirNames() As String ' 目录数组
        Dim nDir As Integer ' 当前路径的目录数
        Dim i As Integer ' 循环计数器变量
        Dim hSearch As Long ' 搜索句柄变量
        Dim WFD As WIN32_FIND_DATA
        Dim Cont As Integer
        If Right(path, 1) <> "\" Then path = path & "\"
        '搜索子目录
        nDir = 0
        ReDim dirNames(nDir)
        Cont = True
        hSearch = FindFirstFile(path & "*", WFD)
        If hSearch <> INVALID_HANDLE_VALUE Then
            Do While Cont
                DirName = StripNulls(WFD.cFileName)
                If (DirName <> ".") And (DirName <> "..") Then
                    If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
                        dirNames(nDir) = DirName
                        DirCount = DirCount + 1
                        nDir = nDir + 1
                        ReDim Preserve dirNames(nDir)
                    End If
                End If
                Cont = FindNextFile(hSearch, WFD) '获取下一个子目录
            Loop
            Cont = FindClose(hSearch)
        End If
        ' 遍历目录并累计文件总数
        hSearch = FindFirstFile(path & SearchStr, WFD)
        Cont = True
        If hSearch <> INVALID_HANDLE_VALUE Then
            While Cont
                FileName = StripNulls(WFD.cFileName)
                If (FileName <> ".") And (FileName <> "..") Then
                FindFileSAPI = FindFileSAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
                FileCount = FileCount + 1
                List1.AddItem path & FileName
                End If
                Cont = FindNextFile(hSearch, WFD) ' 获取下一个文件
            Wend
            Cont = FindClose(hSearch)
        End If
        '如果子目录存在则遍历之
        If nDir > 0 Then
            For i = 0 To nDir - 1
                FindFileSAPI = FindFileSAPI + FindFileSAPI(path & dirNames(i) & "\", _
                SearchStr, FileCount, DirCount)
            Next i
        End If
    End Function'查找按钮代码
    Sub Command1_Click()
        Dim SearchPath As String, FindStr As String
        Dim FileSize As Long
        Dim NumFiles As Integer, NumDirs As Integer
        Dim iNull As Integer, lpIDList As Long, lResult As Long
        Dim sPath As String, udtBI As BrowseInfo
        With udtBI
            '设置浏览窗口
            .hWndOwner = Me.hWnd
            '返回选中的目录
            .ulFlags = BIF_RETURNONLYFSDIRS
        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
        
        Screen.MousePointer = vbHourglass
        List1.Clear
        SearchPath = sPath '选中的目录为搜索的起始路径
        FindStr = "*.*" '搜索所有类型的文件(此处可另作定义)
        FileSize = FindFileSAPI(SearchPath, FindStr, NumFiles, NumDirs)
        Text1.Text = "查找到的文件数:" & NumFiles & vbCrLf & "查找的目录数:" & _
        NumDirs + 1 & vbCrLf & "文件大小总共为:" & vbCrLf & _
        Format(FileSize, "#,###,###,##0") & "字节"
        Screen.MousePointer = vbDefault
    End Sub
      

  5.   

    利用FSO我想能够实现你要做的,给你个思路
    函数(路径)
      if 在当前路径下存在其他的folder then
         做你要在所有目录下做的事情
          for each 子folder in 上层folder
           call 函数(子folder的路径)
      else
         函数=返回值
      endif
    函数结束
    你看看是这么个事不
          
      

  6.   

    我的代码:可以用的,窗体上有一个TEXT1,和一个LIST1,还有一个COMMAND1,TEXT1是要搜索的路径,路径后面要有“\",你可以处理一下Option ExplicitDim Filter As String
    Private Function AutoListFiles(ByVal sDirName As String, ByVal FileFilter As String) As BooleanOn Error GoTo RF_ERRORDim sName     As String, sFile       As String, sExt       As StringDim sDirList()     As String, iDirNum       As Integer, i       As Integer
    Dim ExName As String
    '首先枚举所有文件sFile = Dir(sDirName & FileFilter, vbNormal + vbArchive + vbHidden)Do While Len(sFile) > 0  sFile = UCase(Trim(sFile))
      
      i = InStr(1, sFile, ".")
      If i > 0 Then
      ExName = LCase(Mid(sFile, i + 1))
      If InStr(1, Filter, ExName) > 0 Then
        List1.AddItem sDirName & sFile
      End If
      End If
      sFile = Dir       '下一个文件LoopiDirNum = 0sName = Dir(sDirName, vbDirectory)Do While Len(sName) > 0  If sName <> "." And sName <> ".." Then      If GetAttr(sDirName & sName) And vbDirectory Then          iDirNum = iDirNum + 1          ReDim Preserve sDirList(1 To iDirNum)          sDirList(iDirNum) = sDirName & sName & "\"      End If  End If      sName = Dir       '下一个目录LoopFor i = 1 To iDirNum  AutoListFiles sDirList(i), FileFilter   '递归调用NextAutoListFiles = TrueExit FunctionRF_ERROR:MsgBox Err.Description, vbCritical, ""AutoListFiles = FalseEnd FunctionPrivate Sub Command1_Click()
        List1.Clear
        AutoListFiles Text1.Text, "*.*"
    End SubPrivate Sub Form_Load()
        Filter = "*.mp3;*.avi;*.mp4;*.mov;*.asf;*.wmv;*.rm;*.rmvb;*.exe;*.dat;*.swf;*.com"
    End Sub
      

  7.   

    不用那么麻烦吧,下面是一个文件夹遍历查找文件的代码,你该动一下就可以啦Option ExplicitPrivate Sub Command1_Click()
       Debug.Print SeachFile("D:\ヘ簽・ァマー\lhut3227\Source", "doc")End Sub'*************************************************************************
    '**FunctionName」コSeachFile
    '**Input       」コPathStr(String)-Folder's path ExtensionName(String)-Extension Name which will be seach
    '**OutPut      」コ(Long) -The count of Files
    '**Description 」コSeach File and Print FileName
    '**Global Var  」コNULL
    '**Author      」コ******
    '**Data        」コ
    '**Version     」コV1.0.0
    '*************************************************************************
    Public Function SeachFile(PathStr As String, ExtensionName As String) As Long
        On Error GoTo ToExit 'エェエ﨔ンレ・
        '------------------------------------------------    Dim Fso As FileSystemObject
        Dim Fols As Folders
        Dim Fol As Folder
        Dim Fils As Files
        Dim Fil As File
        If Right(PathStr, 1) <> "\" Then PathStr = PathStr & "\"
        Set Fso = CreateObject("Scripting.FileSystemObject")
        Set Fol = Fso.GetFolder(PathStr)
        Set Fils = Fol.Files    For Each Fil In Fol.Files
            If Fso.GetExtensionName(Fil.Name) = ExtensionName Then
                Debug.Print Fil.Path & "\" & Fil.Name
                SeachFile = SeachFile + 1
            End If
        Next
        DoEvents
        Set Fols = Fol.SubFolders
        For Each Fol In Fols
            Call SeachFile(Fol.Path, ExtensionName)
        Next    '------------------------------------------------
        Exit Function
        '----------------
    ToExit:
        Debug.Print "Error Data:" & Format(Now, "YYYY-MM-DD HH:MM:SS")
        Debug.Print "Error Type:" & Err.Number
        Debug.Print "ErrorDescription:" & Err.Description
        Debug.Print "ErrorSource:" & "SeachFile"
        Debug.Print "SystemTitle:" & "Form1"
    End Function