Скрипт рекурсивного поиска файлов возвращает только файлы первой подпапки - PullRequest
0 голосов
/ 03 апреля 2020

Первое сообщение здесь, в Stackoverflow, дайте мне знать, если что-то не так.

Я работал над сценарием VBA, который возвращает список всех файлов в папке и ее подпапках. (в виде строки)

Однако он возвращает только файлы основной папки и первой подпапки. Это действительно странно, потому что я отчетливо вижу, как он проходит по всем папкам, но почему-то он не возвращает переменную 'getfiles' для других папок.

Sub test()
    MsgBox getfiles("L:\", True)
End Sub

Функция:

Function getfiles(startFolder As String, doSubfolders As Boolean) As String
    Dim fso As New FileSystemObject
    Dim f As Folder, sf As Folder

    Set f = fso.GetFolder(startFolder)

    'loop through files
    For Each File In f.Files
        getfiles = getfiles & File.path & "|"
    Next

    'loop through subfolders
    If doSubfolders = True Then
        For Each sf In f.SubFolders
            getfiles = getfiles & getfiles(sf.path, doSubfolders)
        Next
    End If
End Function

Редактировать: Решено. Вывод был отключен, вероятно, из-за предельного значения msgbox. Скрипт просто работает.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

для улучшения того, что уже является решением, вы должны избегать создания экземпляров FSO каждый раз

Sub main()

    Dim FSO As Object
    Set FSO = CreateObject("Scripting.Filesystemobject") ' instantiate FSO once and for all

    Dim sFiles As String

    sFiles = GetFiles(FSO, "C:\...", True) ' pass instance of FSO, too

End Sub


Function GetFiles(FSO As Object, startFolder As String, doSubfolders As Boolean) As String ' accept FSO as argument
    Dim f As Object, sf As Object, file As Object

    Set f = FSO.GetFolder(startFolder) ' use passed instance of FSO

    'loop through files
    For Each file In f.Files
        GetFiles = GetFiles & file.Path & "|"
    Next

    'loop through subfolders
    If doSubfolders Then
        For Each sf In f.SubFolders
            GetFiles = GetFiles & GetFiles(FSO, sf.Path, doSubfolders) ' pass passed instance of FSO
        Next
    End If
End Function
1 голос
/ 03 апреля 2020

Я только что использовал позднюю привязку, и она работает для меня. Вы можете проверить этот код.

  Function getfiles(startFolder As String, doSubfolders As Boolean) As String
    Dim FSO As Object
Set FSO = CreateObject("Scripting.Filesystemobject")
    Dim f As Object, sf As Object

    Set f = FSO.GetFolder(startFolder)

    'loop through files
    For Each File In f.Files
        getfiles = getfiles & File.Path & "|"
    Next

    'loop through subfolders
    If doSubfolders = True Then
        For Each sf In f.SubFolders
            getfiles = getfiles & getfiles(sf.Path, doSubfolders)
        Next
    End If
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...