любая функция для вывода списка всех файлов указанного типа в папке в VB6

Я хотел бы знать, есть ли какие-то встроенные функции для сценария, описанного ниже:

Входными данными является путь к родительской папке. Что должна делать функция, она должна перечислять все файлы .zip внутри этой родительской папки. Родительская папка может содержать любое количество подпапок, и то же самое относится и к подпапкам. Кто-нибудь может мне помочь с этим?

Версия VB - это не баррикада. Подходит любая из версий VB6 или VS2005. Пожалуйста, помогите мне. Также есть ли другой альтернативный способ, если нет встроенных функций как таковых. Заранее спасибо.


person anonymous user    schedule 08.04.2009    source источник


Ответы (6)


Для 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.

person Tomalak    schedule 08.04.2009


В VB6 вы хотите использовать FileSystemObject среды выполнения сценариев Microsoft. Вы можете получить доступ к среде выполнения сценариев, установив на нее ссылку.

Платформа .NET имеет аналогичный, но более функциональный набор объектов обработки файлов / каталогов в пространстве имен System.IO.

Следующий пример использования FileSystemObject в VB6.

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
person RS Conley    schedule 08.04.2009

В 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, но это основная идея.

person Jim Mack    schedule 08.04.2009

Еще один удар:

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
person Bob    schedule 08.04.2009

Просто подключите класс CDirDrill, который сделает все за вас, в полном родном VB6. Еще одно отличное решение от Карла Петерсона :)

Кстати, я также рекомендую избегать FileSystemObject. У меня были ошибки, потому что одному клиенту удалось испортить scrrun.dll на своем компьютере. Устраните зависимости, если они действительно вам не помогают.

person MarkJ    schedule 09.04.2009