在VB6

2009-04-08 33 views
2

列明指定類型的所有文件的文件夾中,我想知道是否有一些在下面描述的情景內置功能中的任何功能:在VB6

的輸入路徑父文件夾。該函數必須做的是,它應該列出該父文件夾內的所有.zip文件。父文件夾可以包含任意數量的子文件夾,這同樣適用於子文件夾。任何人都可以幫我解決這個問題嗎?

VB版本不是街壘。任何版本的VB6或VS2005都可以。請幫助我。如果沒有內置的功能,還有其他的替代方法。提前致謝。

回答

7

對於VB6.0我會利用FileSystemObject和一個小的遞歸函數。

Sub test() 
    Dim fso As New Scripting.FileSystemObject 
    Dim files As New Collection 
    Dim file As Scripting.file 

    GetFilesRecursive fso.GetFolder("C:\YourFolder"), "zip", files, fso 

    For Each file In files 
    Debug.Print file.Name 
    Next file 
End Sub 

Sub GetFilesRecursive(f As Scripting.Folder, filter As String, c As Collection, fso As Scripting.FileSystemObject) 
    Dim sf As Scripting.Folder 
    Dim file As Scripting.file 

    For Each file In f.Files 
    If InStr(1, fso.GetExtensionName(file.Name), filter, vbTextCompare) = 1 Then 
     c.Add file, file.path 
    End If 
    Next file 

    For Each sf In f.SubFolders 
    GetFilesRecursive sf, filter, c, fso 
    Next sf 
End Sub 

雖然這不會閃電般快。只有通過直接使用Win32 API函數(如FindFirstFile和FindNextFile)才能獲得最大性能。

4

使用VB.NET,你可以用System.IO.Directory.GetFiles來做到這一點。有一個版本需要一個模式來搜索,並讓你搜索子目錄。

For Each dir In Directory.GetFiles("path","*.zip",SearchOptions.AllDirectories) 
    Console.WriteLine(_ 
     "{0,-25} {1,25}", dir.FullName, dir.LastWriteTime) 
Next dir 
1

在VB6中,您希望使用Microsoft腳本運行時的FileSystemObject。您可以通過設置對其的引用來訪問腳本運行時。

NET框架具有在System.IO命名空間

的類似的但更強大的組文件/目錄處理對象的以下說明如何在VB6使用FileSystemObject的一個例子。

Dim FSO As FileSystemObject 
Dim Folder As Folder 
Dim SubFolder As Folder 
Dim File As File 

Set FSO = New FileSystemObject 

Set Folder = FSO.GetFolder("C:\") 
For Each File In Folder.Files 
    Debug.Print File.Name 
Next File 

For Each SubFolder In Folder.SubFolders 
    Debug.Print SubFolder.Name 
Next SubFolder 

Set Folder = Nothing 
Set SubFolder = Nothing 
Set FSO = Nothing 
1

VB6沒有任何功能可以在一次點擊中完成此操作,但可以直接獲得所有ZIP文件的列表(例如)。

由於以下幾個原因,不推薦使用FSO:一種是增加依賴項,另外兩種依賴於腳本,可能會根據策略禁用腳本。

總之,這裏的就可以添加一個最低限度的例子:

Dim Fils() As String 
Dim Counter As Long 
Dim CurrentFile As String 

Redim Fils(0 To 999) As String 

CurrentFile = Dir$(yourpath & "*.zip") 

Do While LenB(CurrentFile) 
    Fils(Counter) = CurrentFile 
    Counter = Counter + 1 
    CurrentFile = Dir$() 
Loop 

當然,要添加限制檢查等,並根據需要REDIM,但是這是基本的想法。

1

另一個刺吧:

Private Sub EnumSubfiles(ByVal ParentFolder As String, _ 
         ByVal FilePattern As String) 
    'Report back via Report subroutine. 
    Dim SubFolders As Collection 
    Dim Name As String 
    Dim FQName As String 
    Dim SubFolder As Variant 

    Set SubFolders = New Collection 
    Name = Dir$(ParentFolder & "\*", vbNormal Or vbDirectory) 
    Do Until Len(Name) = 0 
     FQName = ParentFolder & "\" & Name 
     If (GetAttr(FQName) And vbDirectory) = vbDirectory Then 
      If Not (Name = "." Or Name = "..") Then 
       SubFolders.Add FQName 
      End If 
     Else 
      If Name Like FilePattern Then Report FQName 
     End If 
     Name = Dir$() 
    Loop 
    For Each SubFolder In SubFolders 
     EnumSubfiles SubFolder, FilePattern 
    Next 
End Sub 
1

剛落,在CDirDrill class,做這一切對你來說,在全面的本地VB6。從Karl Peterson :)

另一個優秀的解決方案順便說一句我也建議避免FileSystemObject。我遇到過錯誤,因爲某些客戶已經設法在他們的PC上清除scrrun.dll。消除依賴關係,除非他們真的幫助你很多。