¿É ÒÔ Ê¹ ÓÃ 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À´ Êµ ÏÖ Õâ Ñù µÄ ¹¦ ÄÜ ¡£ ÏÂ Ãæ µÄ ÄÚ ÈÝ Õª ×Ô Õâ Æª ÎÄ ÕÂ £º 
    
    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. 
     
     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 
    ----------------------------------------------------- 
    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 
<END>
Õâ Àï ÎÒ Ïë ÌÖ ÂÛ Ò» ÏÂ ¹Ø ÓÚ ÉÏ Ò» Æª ÎÄ ÕÂ ÖÐ Ìá µ½ µÄ ¡° Method 3: Use the FileSystem Object with Visual Basic ¡± 
    ÔÚ ´° Ìå ÉÏ ·Å ÖÃ Drive,Dir,List,Button1,Button2£¨ DriveÓë DirµÄ ¹Ø Áª ´ú Âë ´Ë ´¦ Ê¡ ÂÔ £© 
    Button1Íê ³É ½« DirÖÐ Ñ¡ ÖÐ µÄ Ä¿ Â¼ ÏÂ Ëù ÓÐ ÎÄ ¼þ Ìí ¼Ó µ½ List,Button2Íê ³É ½« DirÖÐ Ñ¡ ÖÐ µÄ Ä¿ Â¼ ÏÂ (°ü À¨ ×Ó Ä¿ Â¼ £© Ëù ÓÐ ÎÄ ¼þ Ìí ¼Ó µ½ List 
    Button1µÄ ´ú Âë Èç ÏÂ £º 
    Private Sub Command1_Click() 
     Dim FS, F, S, f1 
     Set FS = CreateObject("Scripting.FileSystemObject") 
     Set F = FS.GetFolder(Dir1.Path) 
     Set S = F.subfolders 
     List1.AddItem ("TotalNumber " & S.Count) 
     For Each f1 In S 
     List1.AddItem (f1.Name) 
     Next 
    End Sub 
    Button2µÄ ´ú Âë Èç ÏÂ £º 
    Private Sub Command5_Click() 
     Dim FS, F, S, f1 
     Set FS = CreateObject("Scripting.FileSystemObject") 
     Set F = FS.GetFolder(Dir1.Path) 
     Search F, 0 
    End Sub 
    Æä ÖÐ µ÷ ÓÃ SearchµÄ ´ú Âë Èç ÏÂ £º 
    Public Sub Search(FolderName, ByVal Num As Integer) 
     Dim SubFolder, Folders, FileSysObj, Folder 
     Set FileSysObj = CreateObject("Scripting.FileSystemObject") 
     Set Folder = FileSysObj.GetFolder(FolderName) 
     Set Folders = Folder.subfolders 
     Dim S As String 
     S = "" 
     For i = 1 To Num 
     S = "¡¡ ¡¡ " + S 
     Next i 
     If Folders.Count > 0 Then 
     For Each SubFolder In Folders 
     List1.AddItem (S & SubFolder.Name) 
     Search SubFolder, Num + 1 
     Next 
     End If 
    End Sub 
<END>