любая функция для перечисления всех файлов указанного типа в папке в VB6 - PullRequest
2 голосов
/ 08 апреля 2009

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

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

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

Ответы [ 6 ]

7 голосов
/ 08 апреля 2009

Для 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 голосов
/ 08 апреля 2009

Используя 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 голос
/ 09 апреля 2009

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

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

1 голос
/ 08 апреля 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
1 голос
/ 08 апреля 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

Конечно, вы хотите добавить проверку лимитов и т. Д. И, при необходимости, выполнить редим, но это основная идея.

1 голос
/ 08 апреля 2009

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

.NET Framework имеет аналогичный, но более функциональный набор объектов обработки файлов / каталогов в пространстве имен 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...