2016-10-30 4 views
2

У меня была процедура рекурсивного поиска файлов, и мой компьютер отключился. Я знаю, в каком каталоге была остановлена ​​процедура, есть ли способ указать начальную папку для рекурсивного поиска файлов? Например, предположим, что это моя структураOmit Folders From Recursive File Search

R:\ 
R:\Test\ 
R:\Test\Folder1\ 
R:\Test1\ 
R:\Test1\Folder1\ 
R:\Test2\ 
R:\Test2\Folder2\ 

если я хотел рекурсивный поиск, чтобы начать в

R:\Test1\Folder1\ 

как бы процедура идти?

Option Compare Database 

Sub ScanTablesWriteDataToText() 
Dim Fileout As Object 
Dim fso As Object 
Dim objFSO As Object 
Dim accapp As Access.Application 
Dim db As DAO.Database 
Dim tdf As DAO.TableDef 
Dim colFiles As Collection 
Set objFSO = CreateObject("Scripting.FileSystemObject") 

Dim objRegExp As Object 
Set objRegExp = CreateObject("VBScript.RegExp") 
objRegExp.Pattern = ".jpg" 
objRegExp.IgnoreCase = True 

Set colFiles = New Collection 

RecursiveFileSearch "R:\", objRegExp, colFiles, objFSO 

For Each f In colFiles 
    'do something 
Next 
Set objFSO = Nothing 
Set objRegExp = Nothing 

End Sub 
Sub RecursiveFileSearch(ByVal targetFolder As String, ByRef objRegExp As Object, _ 
       ByRef matchedFiles As Collection, ByRef objFSO As Object) 

Dim objFolder As Object 
Dim objFile As Object 
Dim objSubFolders As Object 
Set objFolder = objFSO.GetFolder(targetFolder) 
For Each objFile In objFolder.files 
    If objRegExp.test(objFile) Then 
     matchedFiles.Add (objFile) 
    End If 
Next 
Set objSubFolders = objFolder.Subfolders 
For Each objSubfolder In objSubFolders 
    RecursiveFileSearch objSubfolder, objRegExp, matchedFiles, objFSO 
Next 
Set objFolder = Nothing 
Set objFile = Nothing 
Set objSubFolders = Nothing 

End Sub 
+0

Вы хотите найти 'R: \ Test1 \ Folder1 \, R: \ Test2 \, R: \ Test2 \ Folder2 \' или вы заинтересованы в поиске второго уровня например: «R: \ Test1 \ Folder1 \, R: \ Test2 \ Folder2 \'? –

ответ

0

Я бы изменить рекурсивные югу включить еще два параметра - один для папки, которую вы пытаетесь найти и логическое значение, чтобы указать, является ли это было найдено:

Sub RecursiveFileSearch(ByVal targetFolder As String, ByRef objRegExp As Object, _ 
       ByRef matchedFiles As Collection, ByRef objFSO As Object, _ 
       ByVal startFolder As String, ByVal found As Boolean) 

    Dim objFolder As Object 
    Dim objFile As Object 
    Dim objSubFolders As Object 
    Set objFolder = objFSO.GetFolder(targetFolder) 

    If startFolder = "" Or found Then 
    For Each objFile In objFolder.files 
     If objRegExp.test(objFile) Then 
      matchedFiles.Add (objFile) 
     End If 
    Next 
    End If 

    Set objSubFolders = objFolder.Subfolders 
    For Each objSubFolder In objSubFolders 
    If objSubFolder = startFolder Then 
     found = True 
    End If 

    RecursiveFileSearch objSubFolder, objRegExp, matchedFiles, objFSO, _ 
     startFolder, found 
    Next 

    Set objFolder = Nothing 
    Set objFile = Nothing 
    Set objSubFolders = Nothing 

End Sub 

Когда вы это называете, это было бы:

RecursiveFileSearch "R:\", objRegExp, colFiles, objFSO, "R:\Test1\Folder1\", false 
0

вы можете укороченные это, запустив (элегантный) PowerShell

Сплин рекурсивный список JPG в C:\temp\filename.csv

Sub Comesfast() 
X2 = Shell("powershell.exe get-childitem ""C:\Test1\Folder1"" -recurse | where {$_.extension -eq "".jpg""} | Select-Object FullName| export-csv ""C:\temp\filename.csv"" ", 1) 
End Sub 
+0

Мне нравится опция powershell, но нужно, чтобы это было сделано через VBA – MasterOfStupidQuestions