Tom's Guide | Tom's Hardware | Tom's Games
![]() |
![]() |
![]() |
Hello, I have a vb program that lists only msi files in a directory, I want it to list msi files in sub directorys of this directory, can anyone help me out with this?
here is my existing code.
Private Sub ListFiles(strPath As String, Optional Extention As String) 'Leave Extention blank for all files Dim File As String If Right$(strPath, 1) <> "\" Then strPath = strPath & "\" If Trim$(Extention) = "" Then Extention = "*.*" ElseIf Left$(Extention, 2) <> "*." Then Extention = "*." & Extention End If File = Dir$(strPath & Extention) Do While Len(File) List1.AddItem File File = Dir$ Loop End SubI took this code off the web an adjusted it slightly to fit my needs, probably not the best since now I am struggling to figure out exactly how to get it to list the files from sub directories.
Any help much appreciated.
Thanks

To do what you want you need to have a recursive funcion. A recursive function is a function that calls itself. Like this:
Sub getSubDirectories(FilePath As String)
Dim a As Integer
Dim d As Integer
File1.Path = FilePath
If File1.ListCount > 0 Then
For a = 0 To File1.ListCount - 1
If Len(Dir1.Path) = 3 Then
List1.AddItem File1.Path & File1.List(a)
Else
List1.AddItem File1.Path & "\" & File1.List(a)
End If
Next
End If
DoEvents
Dir1.Path = FilePath
If Dir1.ListCount > 0 Then
For d = 0 To Dir1.ListCount - 1
Dir1.Path = Dir1.List(d)
getSubDirectories Dir1.Path
Dir1.Path = ".."
Next
End If
End SubIt uses the FileList and DireList controls tolist the files and directories being searched.
It keeps calling itself until Dir1.list count = 0
Stuart

Thanks for the reply, Im not sure how I can integrate this with my existing code, for example I call the ListFiles function I have above in the Form Load section like this.
ListFiles "C:\temp\", "msi"Would i simply need to call the getSubDirectories in the same way alongside ListFiles? e.g.
ListFiles "C:\temp\", "msi" getSubDirectories "C:\temp\"??

You could try using the winapi; here's a recursive function found the VB apiguide, which works great.
'Create a form with a command button (command1), a list box (list1) 'and four text boxes (text1, text2, text3 and text4). '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, DirCount As Integer) 'KPD-Team 1999 'E-Mail: KPDTeam@Allapi.net 'URL: <a href="http://www.allapi.net/" target="_blank">http://www.allapi.net/</a> 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, 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 Screen.MousePointer = vbHourglass List1.Clear SearchPath = Text1.Text FindStr = Text2.Text FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs) Text3.Text = NumFiles & " Files found in " & NumDirs + 1 & " Directories" Text4.Text = "Size of files found under " & SearchPath & " = " & Format(FileSize, "#,###,###,##0") & " Bytes" Screen.MousePointer = vbDefault End SubYou wouldn't need some of the sample program. The listbox would show any files found, which you could use, but the first text box is for the start path and the second text box is for the the file pattern... you wouldn't need them.
Mill over the command1_click function in the sample to see what you'd actually need to replace.
Hope that helps

shutat your example is working great, i have changed it slightly so it doesn't involve as many text boxes but brilliant.
Thanks for your help it is much appreciated!

![]() |
vbscript custom title
|
Batch file
|

This post is quite old and has been locked from receiving new replies. Please create a new posting instead.
| Ads by Google |