VB Quicktakes - Recursive File Search
Use the code below to run a recursive directory search. Place this code in a module and call the FindFile function. This file should be passed the path to be searched, the filename to be found and a string array which will contain all the relevant paths.
Option Explicit '************************************** 'Windows API/Global Declarations for :Fi ' ndFile '************************************** Public Const MAX_PATH = 260 Type FILETIME ' 8 Bytes dwLowDateTime As Long dwHighDateTime As Long End Type Type WIN32_FIND_DATA ' 318 Bytes dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved_ As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * 14 End Type Public Declare Function FindFirstFile& Lib "kernel32" _ Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData _ As WIN32_FIND_DATA) Public Declare Function FindClose Lib "kernel32" _ (ByVal hFindFile As Long) As Long Private Declare Function FindNextFile Lib "kernel32" _ Alias "FindNextFileA" (ByVal hFindFile As Long, _ lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function PathMatchSpec Lib "Shlwapi" _ Alias "PathMatchSpecW" (ByVal pszFileParam As Long, _ ByVal pszSpec As Long) As Boolean
Public Function FindFile(path As String, Filename As String, strFileList() As String) As Boolean Dim fdata As WIN32_FIND_DATA, hFind As Long, curFile As String, retPath As String Dim AddFile As Boolean If Right(path, 1) <> "\" Then path = path & "\" End If hFind = FindFirstFile(path & "*.*", fdata) If hFind = 0 Then ' no files found FindFile = "" Exit Function End If Do curFile = Left$(fdata.cFileName, InStr(fdata.cFileName, Chr$(0))) ' If it's a directory If fdata.dwFileAttributes And vbDirectory And _ curFile <> "." + vbNullChar And curFile <> ".." + vbNullChar Then retPath = FindFile(Left(path & curFile, Len(path & curFile) - 1), Filename, strFileList) If retPath <> "" Then FindFile = retPath End If Else ' If it's a file If MatchSpec(curFile, Filename) Then FindFile = True If Isdimmed(strFileList) Then ReDim Preserve strFileList(UBound(strFileList) + 1) strFileList(UBound(strFileList)) = path & curFile Else ReDim strFileList(0) strFileList(0) = path & curFile End If Exit Function End If End If DoEvents Loop While FindNextFile(hFind, fdata) hFind = FindClose(hFind) End Function
Public Function MatchSpec(File As String, Spec As String) As Boolean ' Returns True if the file name matches a wildcard match ' type (e.g. "*.doc"). MatchSpec = PathMatchSpec(StrPtr(File), StrPtr(Spec)) End Function