Can anyone tell me how to find out how many files I hae on a PC wih the name, let's say, "File.mdb"?
I used the SearchTreeForFile, but this only returns the path to the first occurance. I want to be able to list all occurances of a file.
Any ideas?
Printable View
Can anyone tell me how to find out how many files I hae on a PC wih the name, let's say, "File.mdb"?
I used the SearchTreeForFile, but this only returns the path to the first occurance. I want to be able to list all occurances of a file.
Any ideas?
Hi there Innofin,
using the FSO might be to slow, but anyways, this is one way of doing it
VB Code:
Option Explicit Private Function FoldersWhereFileExists(ByVal sFolder As String, sFileName As String) As String Dim fso As New FileSystemObject Dim f As Folder Dim fldr As Folder Dim fil As File Dim sFoldersContainingFiles As String 'set start folder Set fldr = fso.GetFolder(sFolder) For Each fil In fldr.Files If UCase(fil.Name) = UCase(sFileName) Then sFoldersContainingFiles = sFoldersContainingFiles & fldr.Path & vbCrLf Exit For End If Next fil FoldersWhereFileExists = sFoldersContainingFiles 'in order to retrieve all the subs in the subs in the subs.... uh... _ 'we have to call 'ourselfs' until there are no more subfolders left... If fldr.SubFolders.Count > 0 Then For Each f In fldr.SubFolders FoldersWhereFileExists = FoldersWhereFileExists & FoldersWhereFileExists(f.Path, sFileName) Next f End If End Function Private Sub Command1_Click() MsgBox FoldersWhereFileExists("C:\", "testigs.txt") End Sub
i've attached an example from APIGuide that i've modified slightly for you (zip file).
this is the code in the main form though:
VB Code:
'Create a form with a command button (command1), a list box (list1) 'and three text boxes (text1, text2, text3). 'Type in the first textbox a startingpath like c:\ 'and in the second textbox you put a pattern like *.* or *.txt Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) 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 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 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) 'KPD-Team 1999 'E-Mail: [email][email protected][/email] 'URL: [url]http://www.allapi.net/[/url] 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... Dim hSearch As Long ' Search Handle Dim WFD As WIN32_FIND_DATA Dim Cont As Integer If Right(path, 1) <> "\" Then path = path & "\" ' Search for subdirectories. nDir = 0 ReDim dirNames(nDir) Cont = True hSearch = FindFirstFile(path & "*", WFD) If hSearch <> INVALID_HANDLE_VALUE Then Do While Cont DirName = StripNulls(WFD.cFileName) ' Ignore the current and encompassing directories. If (DirName <> ".") And (DirName <> "..") Then ' Check for directory with bitwise comparison. 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) 'Get next subdirectory. Loop Cont = FindClose(hSearch) End If ' Walk through this directory and sum file sizes. 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) ' Get next file Wend Cont = FindClose(hSearch) End If ' If there are sub-directories... If nDir > 0 Then ' Recursively walk into them... For i = 0 To nDir - 1 FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\", SearchStr, FileCount) Next i End If End Function Sub Command1_Click() Dim SearchPath As String, FindStr As String Dim FileSize As Long Dim NumFiles As Integer Screen.MousePointer = vbHourglass List1.Clear SearchPath = Text1.Text FindStr = Text2.Text FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles) Text3.Text = NumFiles & " Files found" Screen.MousePointer = vbDefault End Sub
Great - Thanks alot!