MartyConnelly
martyconnelly at shaw.ca
Sun May 25 11:02:06 CDT 2003
Here is some rough test code I used for a rough timing test of two
different methods
of finding files ( FileSys and Dir recursion)
I found them about equal (within 1 or 2 seconds) on moderate sized
directories
But on a full disk search (c:\) over 10 Gigs, the time was 3 minutes
for Dir method
(you get 3 or 4 errors thrown up as well) and 1 minute for filesys method.
-------------------------
Dim fso As New FileSystemObject
Dim fld As Folder
' need reference to scrrun.dll scripting runtime
' use FileSys object
Function searchFiles(sDir As String, sSrchString As String)
'searchFiles("c:\Documents and Settings","*.mdb")
'searchFiles("c:\Access Files","*.mdb")
Dim nDirs As Long
Dim nFiles As Long
Dim lSize As Currency
Dim startTime As Date
Dim finishTime As Date
nFiles = 0
nDirs = 0
startTime = Now()
' sDir = InputBox("Type the directory that you want to search for", _
' "FileSystemObjects example", "C:\")
' sSrchString = InputBox("Type the file name that you want to search
for", _
' "FileSystemObjects example", "vb.ini")
'MousePointer = vbHourglass
' Label1.Caption = "Searching " & vbCrLf & UCase(sDir) & "..."
lSize = FindFile(sDir, sSrchString, nDirs, nFiles)
'MousePointer = vbDefault
Debug.Print Str(nFiles) & " files found in" & Str(nDirs) & _
" directories", vbInformation
Debug.Print "Total Size = " & lSize & " bytes"
finishTime = Now()
Debug.Print "no of seconds=" & DateDiff("s", startTime, finishTime)
End Function
Private Function FindFile(ByVal sFol As String, sFile As String, _
nDirs As Long, nFiles As Long) As Currency
Dim tFld As Folder, tFil As File, FileName As String
On Error GoTo Catch
Set fld = fso.GetFolder(sFol)
FileName = Dir(fso.BuildPath(fld.path, sFile), vbNormal Or _
vbHidden Or vbSystem Or vbReadOnly)
While Len(FileName) <> 0
FindFile = FindFile + FileLen(fso.BuildPath(fld.path, _
FileName))
nFiles = nFiles + 1
'List1.AddItem fso.BuildPath(fld.path, FileName)
' Load ListBox or Table
FileName = Dir() ' Get next file
DoEvents
Wend
' Label1 = "Searching " & vbCrLf & fld.path & "..."
nDirs = nDirs + 1
If fld.SubFolders.Count > 0 Then
For Each tFld In fld.SubFolders
DoEvents
FindFile = FindFile + FindFile(tFld.path, sFile, nDirs, nFiles)
Next
End If
Exit Function
Catch: FileName = ""
Resume Next
End Function
---------------------------------
'testfind("c:\Documents and Settings","*.mdb")
'testfind("c:\Access Files","*.mdb")
Function testfind(SearchPath As String, FindStr As String)
' Use Dir recursion
Dim FileSize As Long
Dim NumFiles As Integer, NumDirs As Integer
Dim startTime As Date
Dim finishTime As Date
NumFiles = 0
NumDirs = 0
startTime = Now()
FileSize = FindFiles(SearchPath, FindStr, NumFiles, NumDirs)
Debug.Print NumFiles & " Files found in " & NumDirs + 1 & _
" Directories"
Debug.Print "Size of files found under " & SearchPath & " = " & _
Format(FileSize, "#,###,###,##0") & " Bytes"
finishTime = Now
Debug.Print "no of seconds=" & DateDiff("s", startTime, finishTime)
End Function
Function FindFiles(path As String, SearchStr As String, _
FileCount As Integer, DirCount As Integer)
Dim FileName As String ' Walking filename variable.
Dim DirName As String ' SubDirectory Name.
Dim dirNames() As String ' Buffer for directory name entries.
Dim nDir As Integer ' Number of directories in this path.
Dim i As Integer ' For-loop counter.
On Error GoTo sysFileERR
If Right(path, 1) <> "\" Then path = path & "\"
' Search for subdirectories.
nDir = 0
ReDim dirNames(nDir)
DirName = Dir(path, vbDirectory Or vbHidden Or vbArchive Or
vbReadOnly _
Or vbSystem) ' Even if hidden, and so on.
Do While Len(DirName) > 0
' Ignore the current and encompassing directories.
If (DirName <> ".") And (DirName <> "..") Then
' Check for directory with bitwise comparison.
If GetAttr(path & DirName) And vbDirectory Then
dirNames(nDir) = DirName
DirCount = DirCount + 1
nDir = nDir + 1
ReDim Preserve dirNames(nDir)
'List2.AddItem path & DirName ' Uncomment to list
End If ' directories.
sysFileERRCont:
End If
DirName = Dir() ' Get next subdirectory.
Loop
' Search through this directory and sum file sizes.
FileName = Dir(path & SearchStr, vbNormal Or vbHidden Or vbSystem _
Or vbReadOnly Or vbArchive)
While Len(FileName) <> 0
FindFiles = FindFiles + FileLen(path & FileName)
FileCount = FileCount + 1
' Load List box or table
' List2.AddItem path & FileName & vbTab & _
' FileDateTime(path & FileName) ' Include Modified Date
FileName = Dir() ' Get next file.
Wend
' If there are sub-directories..
If nDir > 0 Then
' Recursively walk into them
For i = 0 To nDir - 1
FindFiles = FindFiles + FindFiles(path & dirNames(i) & "\", _
SearchStr, FileCount, DirCount)
Next i
End If
AbortFunction:
' Debug.Print "abort function=" & DirName
' will pass through here on end of recursion
Exit Function
sysFileERR:
Debug.Print "Unexpected Error=" & Err.Number & "name=" & FileName
& "-" & DirName & Right(DirName, 4)
If Right(DirName, 4) = ".sys" Then
Debug.Print "pagefile.sys"
Resume sysFileERRCont ' Known issue with pagefile.sys
Else
MsgBox "Error: " & Err.Number & " - " & Err.Description, , _
"Unexpected Error" & FileName & "-" & DirName
Debug.Print "resume"
Resume AbortFunction
End If
End Function