列明指定類型的所有文件的文件夾中,我想知道是否有一些在下面描述的情景內置功能中的任何功能:在VB6
的輸入路徑父文件夾。該函數必須做的是,它應該列出該父文件夾內的所有.zip文件。父文件夾可以包含任意數量的子文件夾,這同樣適用於子文件夾。任何人都可以幫我解決這個問題嗎?
VB版本不是街壘。任何版本的VB6或VS2005都可以。請幫助我。如果沒有內置的功能,還有其他的替代方法。提前致謝。
列明指定類型的所有文件的文件夾中,我想知道是否有一些在下面描述的情景內置功能中的任何功能:在VB6
的輸入路徑父文件夾。該函數必須做的是,它應該列出該父文件夾內的所有.zip文件。父文件夾可以包含任意數量的子文件夾,這同樣適用於子文件夾。任何人都可以幫我解決這個問題嗎?
VB版本不是街壘。任何版本的VB6或VS2005都可以。請幫助我。如果沒有內置的功能,還有其他的替代方法。提前致謝。
對於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)才能獲得最大性能。
使用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
在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
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,但是這是基本的想法。
另一個刺吧:
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
剛落,在CDirDrill class,做這一切對你來說,在全面的本地VB6。從Karl Peterson :)
另一個優秀的解決方案順便說一句我也建議避免FileSystemObject。我遇到過錯誤,因爲某些客戶已經設法在他們的PC上清除scrrun.dll。消除依賴關係,除非他們真的幫助你很多。