可以使用Dir函数列出一个目录下的所有文件。比如: Dim sFiles() As String s = Dir("C:\Windows\*.bmp") If s <> "" Then ReDim sFiles(0) As String i = 1 s = Dir() While s <> "" ReDim Preserve sFiles(i) As String sFiles(i) = s i = i + 1 s = Dir() Wend End If
如果你想在一个目录下的所有子目录中进行搜索,需要进行递归搜索。可以参考微软的Knowledge Base的文章:“Q185476 HOWTO: Search Directories to Find or List Files”,介绍了如何利用Windows API来实现这样的功能,其速度比Dir()函数快。下面的内容摘自这篇文章:
SUMMARY =======
When looking for files, it is often necessary to search through subdirectories. This article demonstrates two methods for recursively searching directories and retrieving file information.
MORE INFORMATION ================
While Visual Basic provides methods for retrieving information about files and directories, you may also use Windows API functions for these tasks. Using the API is not faster than the built in methods, but the two methods work a little differently. So, this article demonstrates both techniques for retrieving this information. If you test both methods, try using the same starting path and search string. You should get similar results.
Visual Basic for Applications (VBA) includes an Application.FileSearch object that can be used to find and list files. While not directly available in Visual Basic, you can use it from a Microsoft Office 97 product. More information and examples can be found in the Online Help, and by searching the Microsoft Knowledge Base for "FileSearch."
Please note that the following examples do not include full error trapping, but Method 2 does catch a special case where the VB GetAttr() function fails on Pagefile.sys, which is the Windows NT virtual memory paging file. Also, depending on the search string, the API version lists and counts directory names by default, where the VB version does not.
Method 1: Using the Windows API -------------------------------
1. Start a new Standard EXE project in Visual Basic. Form1 is created by default.
2. Add a command button named Command1, four text boxes named Text1, Text2, Text3 and Text4 and a list box to Form1.
3. Add a Module from the Projects menu and insert the following:
Sample Code -----------
Declare Function FindFirstFile Lib "kernel32" Alias _ "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData _ As WIN32_FIND_DATA) As Long
Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" _ (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Declare Function GetFileAttributes Lib "kernel32" Alias _ "GetFileAttributesA" (ByVal lpFileName As String) As Long
Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) _ As Long
Public Const MAX_PATH = 260 Public Const MAXDWORD = &HFFFF Public Const INVALID_HANDLE_VALUE = -1 Public Const FILE_ATTRIBUTE_ARCHIVE = &H20 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
Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type
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
Public 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
4. Copy the following code into Form1's module:
Sample Code -----------
Option Explicit
Function FindFilesAPI(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... 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
Private 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 Sub
5. Run the Project. Enter a starting path into Text1, a search string in Text2 (like *.* or *.txt) and then click Command1.
You see a list of the files found appear in the list box, the actual number of files found displays in Text3, and the total size of the files found under the starting directory appears in Text4.
Method 2: Using Built-In Visual Basic Functions -----------------------------------------------
1. Start a new Standard EXE project in Visual Basic. Form1 is created by default.
2. Add a command button named Command1, four text boxes named Text1, Text2, Text3 and Text4 and a list box to Form1.
3. Copy the following code into Form1's module:
Sample Code -----------
Option Explicit
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.
例 CurrentPath = GetPath(gMDBPath)
nDirectory = 0
sFileName = Dir(CurrentPath & "*.*", vbDirectory) Do While sFileName <> "" ReDim Preserve sDirectoryList(nDirectory) sDirectoryList(nDirectory) = CurrentPath & sFileName nDirectory = nDirectory + 1 sFileName = Dir Loop
For i = 1 To nDirectory frmMain.List1.AddItem sDirectoryList(i - 1) Next
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) ' Even if hidden. 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) ' List1.AddItem path & DirName ' Uncomment to list ' directories. End If 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) While Len(FileName) <> 0 FindFiles = FindFiles + FileLen(path & FileName) FileCount = FileCount + 1 List1.AddItem path & FileName ' Load List box 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: Exit Function sysFileERR: If Right(DirName, 4) = ".sys" Then Resume sysFileERRCont ' Known issue with pagefile.sys Else MsgBox "Error: " & Err.Number & " - " & Err.Description, , _ "Unexpected Error" Resume AbortFunction End If End Function
Private 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 = FindFiles(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 Sub
4. Run the Project. Enter a starting path into Text1, a search string in Text2 (like *.* or Myfile?.txt, and so forth) and then click Command1.
You will see a list of files found appear in the list box, the number of files found in Text3, and the total size of the files found under the starting directory in Text4.
Method 3: Use the FileSystem Object with Visual Basic ----------------------------------------------------- (参见下面Ted的意见) For information about using the FileSystemObject with Visual Basic to find or list files, please see the following article in the Microsoft Knowledge Base:
ARTICLE-ID: Q185601 HOWTO: Recursively Search Directories Using FileSystemObject
还可以显示子目录的,fso简单 Option Explicit Dim FSO As Scripting.FileSystemObject Dim SFlag As BooleanSub CheckFolder(strPath As String) Dim objFolder As Scripting.Folder '文件夹对象 Dim objFile As Scripting.File '文件对象 Dim objSubdirs As Scripting.Folders '文件夹集合对象 Dim objLoopFolder As Scripting.Folder '文件夹对象 Dim flag As Boolean
' 获得目录 Set objFolder = FSO.GetFolder(strPath)
' 检查目录中的文件 For Each objFile In objFolder.Files lstfiles.AddItem objFile.Path Next objFile
' 在所有子目录中循环 Set objSubdirs = objFolder.SubFolders For Each objLoopFolder In objSubdirs '递归调用CheckFolder子过程,实现目录树的遍历。 CheckFolder objLoopFolder.Path Next objLoopFolder
' 释放对象所占内存 Set objSubdirs = Nothing Set objFolder = Nothing End Sub' 清空 Private Sub clrcmd_Click() lstfiles.Clear End Sub' 查找 Private Sub cmdgo_Click() Set FSO = New Scripting.FileSystemObject stopcmd.Enabled = True CheckFolder "d:\php4" End Sub' 退出 Private Sub quitcmd_Click() End End Sub
用dir就可以了,不过文件比较多的话,可能比较慢 用lb_dir可能最简单了,如下,别人的例子 'Example Name:Filling a List with Files, Directories and Drives'------------------------------------------------------------------------------ ' ' Form Code ' '------------------------------------------------------------------------------ Option ExplicitPrivate Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" _ (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any) As LongPrivate Const LB_DIR = &H18D Private Const LB_RESETCONTENT = &H184Private Const DDL_READWRITE = &H0 Private Const DDL_READONLY = &H1 Private Const DDL_HIDDEN = &H2 Private Const DDL_SYSTEM = &H4 Private Const DDL_DIRECTORY = &H10 Private Const DDL_ARCHIVE = &H20 Private Const DDL_DRIVES = &H4000 Private Const DDL_EXCLUSIVE = &H8000& Private Const DDL_POSTMSGS = &H2000 Private Const DDL_FLAGS = DDL_ARCHIVE Or DDL_DIRECTORYPrivate Sub Form_Load() Command1(0).Caption = "normal files" Command1(1).Caption = "normal files and folders" Command1(2).Caption = "hidden files" Command1(3).Caption = "system files" Command1(4).Caption = "folders" Command1(5).Caption = "drives"End Sub Private Sub Command1_Click(Index As Integer) Dim found As Long Dim DDL_FLAGS As Long Dim sPath As String
sPath = "c:\winnt\*.*"
Select Case Index Case 0: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_ARCHIVE Case 1: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_ARCHIVE Or DDL_DIRECTORY Case 2: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_HIDDEN Case 3: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_SYSTEM Case 4: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_DIRECTORY Case 5: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_DRIVES Case Else End Select
'clear and populate the listbox Call SendMessage(List1.hwnd, LB_RESETCONTENT, 0, ByVal 0) found = SendMessage(List1.hwnd, LB_DIR, DDL_FLAGS, ByVal sPath) Label1.Caption = found + 1 & " " & Command1(Index).Caption & " found."
End Sub
Option Explicit
Dim m_lngFileCount As Long 定义计数器
Dim m_objFSO As Scripting.FileSystemObject 定义文件系统对象
Sub Main()
Set m_objFSO = New Scripting.FileSystemObject
m_lngFileCount = 0
CheckFolder "C:\"
Debug.Print "C盘下GIF文件总数: " & m_lngFileCount
End Sub
Sub CheckFolder(strPath As String)
Dim objFolder As Scripting.Folder 文件夹对象
Dim objFile As Scripting.File 文件对象
Dim objSubdirs As Scripting.Folders 文件夹集合对象
Dim objLoopFolder As Scripting.Folder 文件夹对象
Debug.Print "Checking directory " & strPath
Set objFolder = m_objFSO.GetFolder(strPath)
检查目录中的文件
For Each objFile In objFolder.Files
If UCase$(Right$(objFile.ShortPath, 4)) = ".GIF" Then
Dim sFiles() As String
s = Dir("C:\Windows\*.bmp")
If s <> "" Then
ReDim sFiles(0) As String
i = 1
s = Dir()
While s <> ""
ReDim Preserve sFiles(i) As String
sFiles(i) = s
i = i + 1
s = Dir()
Wend
End If
如果你想在一个目录下的所有子目录中进行搜索,需要进行递归搜索。可以参考微软的Knowledge Base的文章:“Q185476 HOWTO: Search Directories to Find or List Files”,介绍了如何利用Windows API来实现这样的功能,其速度比Dir()函数快。下面的内容摘自这篇文章:
SUMMARY
=======
When looking for files, it is often necessary to search through subdirectories. This article demonstrates two methods for recursively searching directories and retrieving file information.
MORE INFORMATION
================
While Visual Basic provides methods for retrieving information about files and directories, you may also use Windows API functions for these tasks. Using the API is not faster than the built in methods, but the two methods work a little differently. So, this article demonstrates both techniques for retrieving this information. If you test both methods, try using the same starting path and search string. You should get similar results.
Visual Basic for Applications (VBA) includes an Application.FileSearch object that can be used to find and list files. While not directly available in Visual Basic, you can use it from a Microsoft Office 97 product. More information and examples can be found in the Online Help, and by searching the Microsoft Knowledge Base for "FileSearch."
Please note that the following examples do not include full error trapping, but Method 2 does catch a special case where the VB GetAttr() function fails on Pagefile.sys, which is the Windows NT virtual memory paging file. Also, depending on the search string, the API version lists and counts directory names by default, where the VB version does not.
Method 1: Using the Windows API
-------------------------------
1. Start a new Standard EXE project in Visual Basic. Form1 is created by default.
2. Add a command button named Command1, four text boxes named Text1, Text2, Text3 and Text4 and a list box to Form1.
3. Add a Module from the Projects menu and insert the following:
Sample Code
-----------
Declare Function FindFirstFile Lib "kernel32" Alias _
"FindFirstFileA" (ByVal lpFileName As String, lpFindFileData _
As WIN32_FIND_DATA) As Long
Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" _
(ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Declare Function GetFileAttributes Lib "kernel32" Alias _
"GetFileAttributesA" (ByVal lpFileName As String) As Long
Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) _
As Long
Public Const MAX_PATH = 260
Public Const MAXDWORD = &HFFFF
Public Const INVALID_HANDLE_VALUE = -1
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
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
Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
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
Public 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
4. Copy the following code into Form1's module:
Sample Code
-----------
Option Explicit
Function FindFilesAPI(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...
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
Private 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 Sub
5. Run the Project. Enter a starting path into Text1, a search string in Text2 (like *.* or *.txt) and then click Command1.
You see a list of the files found appear in the list box, the actual number of files found displays in Text3, and the total size of the files found under the starting directory appears in Text4.
Method 2: Using Built-In Visual Basic Functions
-----------------------------------------------
1. Start a new Standard EXE project in Visual Basic. Form1 is created by default.
2. Add a command button named Command1, four text boxes named Text1, Text2, Text3 and Text4 and a list box to Form1.
3. Copy the following code into Form1's module:
Sample Code
-----------
Option Explicit
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.
nDirectory = 0
sFileName = Dir(CurrentPath & "*.*", vbDirectory)
Do While sFileName <> ""
ReDim Preserve sDirectoryList(nDirectory)
sDirectoryList(nDirectory) = CurrentPath & sFileName
nDirectory = nDirectory + 1
sFileName = Dir
Loop
For i = 1 To nDirectory
frmMain.List1.AddItem sDirectoryList(i - 1)
Next
If Right(path, 1) <> "\" Then path = path & "\"
' Search for subdirectories.
nDir = 0
ReDim dirNames(nDir)
DirName = Dir(path, vbDirectory Or vbHidden) ' Even if hidden.
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)
' List1.AddItem path & DirName ' Uncomment to list
' directories.
End If
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)
While Len(FileName) <> 0
FindFiles = FindFiles + FileLen(path & FileName)
FileCount = FileCount + 1
List1.AddItem path & FileName ' Load List box
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:
Exit Function
sysFileERR:
If Right(DirName, 4) = ".sys" Then
Resume sysFileERRCont ' Known issue with pagefile.sys
Else
MsgBox "Error: " & Err.Number & " - " & Err.Description, , _
"Unexpected Error"
Resume AbortFunction
End If
End Function
Private 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 = FindFiles(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 Sub
4. Run the Project. Enter a starting path into Text1, a search string in Text2 (like *.* or Myfile?.txt, and so forth) and then click Command1.
You will see a list of files found appear in the list box, the number of files found in Text3, and the total size of the files found under the starting directory in Text4.
Method 3: Use the FileSystem Object with Visual Basic
-----------------------------------------------------
(参见下面Ted的意见)
For information about using the FileSystemObject with Visual Basic to find or list files, please see the following article in the Microsoft Knowledge Base:
ARTICLE-ID: Q185601
HOWTO: Recursively Search Directories Using FileSystemObject
Option Explicit
Dim FSO As Scripting.FileSystemObject
Dim SFlag As BooleanSub CheckFolder(strPath As String)
Dim objFolder As Scripting.Folder '文件夹对象
Dim objFile As Scripting.File '文件对象
Dim objSubdirs As Scripting.Folders '文件夹集合对象
Dim objLoopFolder As Scripting.Folder '文件夹对象
Dim flag As Boolean
' 获得目录
Set objFolder = FSO.GetFolder(strPath)
' 检查目录中的文件
For Each objFile In objFolder.Files
lstfiles.AddItem objFile.Path
Next objFile
' 在所有子目录中循环
Set objSubdirs = objFolder.SubFolders
For Each objLoopFolder In objSubdirs
'递归调用CheckFolder子过程,实现目录树的遍历。
CheckFolder objLoopFolder.Path
Next objLoopFolder
' 释放对象所占内存
Set objSubdirs = Nothing
Set objFolder = Nothing
End Sub' 清空
Private Sub clrcmd_Click()
lstfiles.Clear
End Sub' 查找
Private Sub cmdgo_Click()
Set FSO = New Scripting.FileSystemObject
stopcmd.Enabled = True
CheckFolder "d:\php4"
End Sub' 退出
Private Sub quitcmd_Click()
End
End Sub
用lb_dir可能最简单了,如下,别人的例子
'Example Name:Filling a List with Files, Directories and Drives'------------------------------------------------------------------------------
'
' Form Code
'
'------------------------------------------------------------------------------
Option ExplicitPrivate Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As LongPrivate Const LB_DIR = &H18D
Private Const LB_RESETCONTENT = &H184Private Const DDL_READWRITE = &H0
Private Const DDL_READONLY = &H1
Private Const DDL_HIDDEN = &H2
Private Const DDL_SYSTEM = &H4
Private Const DDL_DIRECTORY = &H10
Private Const DDL_ARCHIVE = &H20
Private Const DDL_DRIVES = &H4000
Private Const DDL_EXCLUSIVE = &H8000&
Private Const DDL_POSTMSGS = &H2000
Private Const DDL_FLAGS = DDL_ARCHIVE Or DDL_DIRECTORYPrivate Sub Form_Load() Command1(0).Caption = "normal files"
Command1(1).Caption = "normal files and folders"
Command1(2).Caption = "hidden files"
Command1(3).Caption = "system files"
Command1(4).Caption = "folders"
Command1(5).Caption = "drives"End Sub
Private Sub Command1_Click(Index As Integer) Dim found As Long
Dim DDL_FLAGS As Long
Dim sPath As String
sPath = "c:\winnt\*.*"
Select Case Index
Case 0: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_ARCHIVE
Case 1: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_ARCHIVE Or DDL_DIRECTORY
Case 2: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_HIDDEN
Case 3: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_SYSTEM
Case 4: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_DIRECTORY
Case 5: DDL_FLAGS = DDL_EXCLUSIVE Or DDL_DRIVES
Case Else
End Select
'clear and populate the listbox
Call SendMessage(List1.hwnd, LB_RESETCONTENT, 0, ByVal 0)
found = SendMessage(List1.hwnd, LB_DIR, DDL_FLAGS, ByVal sPath) Label1.Caption = found + 1 & " " & Command1(Index).Caption & " found."
End Sub
Dim m_lngFileCount As Long 定义计数器
Dim m_objFSO As Scripting.FileSystemObject 定义文件系统对象
Sub Main()
Set m_objFSO = New Scripting.FileSystemObject
m_lngFileCount = 0
CheckFolder "C:\"
Debug.Print "C盘下GIF文件总数: " & m_lngFileCount
End Sub
Sub CheckFolder(strPath As String)
Dim objFolder As Scripting.Folder 文件夹对象
Dim objFile As Scripting.File 文件对象
Dim objSubdirs As Scripting.Folders 文件夹集合对象
Dim objLoopFolder As Scripting.Folder 文件夹对象
Debug.Print "Checking directory " & strPath
Set objFolder = m_objFSO.GetFolder(strPath)
检查目录中的文件
For Each objFile In objFolder.Files
If UCase$(Right$(objFile.ShortPath, 4)) = ".GIF" Then
这一段是条件检查,但找到的文件是否符合给定的条件,这儿通过取文件名的
最后4位看是不是“.GIF“来判断文件是否是GIF文件。
m_lngFileCount = m_lngFileCount + 1
找到指定条件的文件后进行相应的操作,这儿是把计数器加一。
End If
Next objFile
在所有子目录中循环,计数。
Set objSubdirs = objFolder.SubFolders
For Each objLoopFolder In objSubdirs
CheckFolder objLoopFolder.Path
递归调用CheckFolder子过程,实现目录树的遍历。
Next objLoopFolder
Set objSubdirs = Nothing
Set objFolder = Nothing
End Sub