如何不用控件列出某一目录下所有的文件

解决方案 »

  1.   

    用filelistbox不是很好嘛???用fso对象,比较简单
      

  2.   

    可以使用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 
         
      

  3.   

    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. 
         
      

  4.   

    例      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
      

  5.   

    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  
      

  6.   

    还可以显示子目录的,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
      

  7.   

    用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
      

  8.   

    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    
     
    这一段是条件检查,但找到的文件是否符合给定的条件,这儿通过取文件名的  
     
    最后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