软件注册站
热情软件屋

 
如何用程序来把一个目录下面的所有的文件列出来
编号: QA000418    
建立日期: 1999年1月26日 最后修改日期: 1999年11月15日
所属类别: Visual Basic - 磁盘、文件和目录
   
    vb5.0
    中文windows98
    如何用程序来把一个目录下面的所有的文件列出来,并加入到一个数组中去?
    (涂海欢)
   
    可以使用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.
    
     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
    

    Ted的意见:
    这里我想讨论一下关于上一篇文章中提到的“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
    

    

此问题由李海回答。

附加关键字:编程, 源程序, programming, source code, Visual Basic, VB, 磁盘、文件和目录, disk, file, fat, directory, folder

   
 
把这个问题推荐给朋友
   
 
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio