2015-01-08 2 views
3

특정 드라이브를 크롤링하고 하위 디렉토리에있는 특정 .xls 파일의 데이터를 가져 오려고합니다. 드라이브가 TB 이상이고 폴더의 계층 구조가 모두 같지 않아서 모든 폴더를 크롤링하고 있습니다. 지금까지 스크립트는 훌륭하게 작동합니다.Zip 파일을 통한 크롤링

문제는 드라이브에 압축 파일이있는 것입니다. 파일의 절반 이상이 압축 형식입니다. 이 파일들을 어떻게 크롤링 할 수 있습니까?

다음은 하위 디렉토리를 크롤링하는 코드의 일부입니다. 문자열이 아직 없다면 "\"을 문자열에 추가하는 또 다른 함수 "TrailingSlash"가 있습니다. 나는 의견에 대해 저자에게 공언한다.

Public Function recursiveDir(colFiles As Collection, strFolder As String, strFileSpec As String, bIncludeSubfolders As Boolean) as Collection 

    'From Ammara.com/access_image_faq/recursive_folder_search.html 
    'Recursive function to search document tree from specific file extension 

    Dim strTemp As String 
    Dim colFolders As New Collection 
    Dim vFolderName As Variant 
    Dim colFiles As New Collection 
    Dim counter As Integer 

    'Add files in strFolder matching strFileSpec to colFiles 
    strFolder = TrailingSlash(strFolder) 
    strTemp = Dir(strFolder & strFileSpec) 

    On Error Resume Next 
    Do While strTemp <> vbNullString 
     colFiles.Add (strFolder & strTemp) 
     counter = counter + 1 
     Debug.Print ("files found: " & counter) 
     strTemp = Dir 
    Loop 

    If bIncludeSubfolders Then 
     'Fill colFolders with list of subdirectories of strFolder 
     strTemp = Dir(strFolder, vbDirectory) 
     Do While strTemp <> vbNullString 
      If (strTemp <> ".") And (strTemp <> "..") Then 
       If (GetAttr(strFolder & strTemp) And vbDirectory) <> 0 Then 
        colFolders.Add strTemp 
       End If 
      End If 
      strTemp = Dir 
     Loop 

     'Call recursiveDir for each subfolder in colFolders 
     For Each vFolderName In colFolders 
      Call recursiveDir(colFiles, strFolder & vFolderName, strFileSpec, True) 
     Next vFolderName 
    End If 

recursiveDir = colFiles 

End Function 

함수 I는 다음의 데이터를 추출하고 열고 사용 콜렉션 "colFolders"모든 경로 문자열을 추가한다. 지금은 압축 된 폴더 내의 파일에 문자열 경로를 반환하는 간단한 방법이 없을 수도 있다고 생각합니다. 이 함수가 zip을 만났을 때 호출되는 별도의 함수가 필요할 수도 있습니다.이 함수는 Zip 폴더를 통해 크롤링하고 특정 파일을 로컬 대상에 추출합니다 (전체 폴더를 추출 할 필요가없는 한, 우리는 선해야한다).

나는 내가해야 할 일에서 길을 잃었습니다. Googleing around는 shell.Application을 사용함을 나타냅니다. 나는 조개 껍질을 아는 것이 아니라, 내가 취해야 할 길인가?

감사합니다. - 여러분 모두 최고입니다!

+1

[이 답]를 액세스 할 수 있습니다 좋은 명령 줄 유틸리티를 가지고 7-ZIP을 사용하는 것을 선호 (objShell을 통해 반복 할 수 있다면 http://stackoverflow.com/questions/19716587/how-to-open-a-file-from-an-archive-in-vba-without-unzipping-the-archive) 도움이 될 수 있습니다. .NameSpace (strZipFilename) .Items' – stuartd

+0

그래서 Dir() 반복을 사용하는 것과 비슷한 objShell을 반복하는 것이 좋습니다. 아마 Application.Shell을 파헤쳐 야겠네. 이 방법은 하위 디렉토리를 파고들 때 어떻게 작동합니까? – ZAR

+1

각 하위 디렉토리를 트롤링 할 때 zip 파일을 찾을 때 항목을 검색 할 수 있습니다. 압축을 풀 때까지 디렉토리 구조가없는 zip 파일의 항목이 있습니다. – stuartd

답변

0

은 하위 폴더를 검색하는 대신이 코드를보십시오 :

Sub SO() 

Dim x, i 

x = GetFiles("C:\Users\SO\Folder", "*.xls*", True) '// x becomes an array of files found 

For Each i In x 
    Debug.Print i 
Next i 

End Sub 

'------------------------------------------------- 

Function GetFiles(StartPath As String, FileType As String, SubFolders As Boolean) As Variant 

StartPath = StartPath & IIf(Right(StartPath, 1) = "\", vbNullString, "\") 'Sanity check 

GetFiles = Split(Join(Filter(Split(CreateObject("WScript.Shell").Exec("CMD /C DIR """ & StartPath & FileType & """ " & _ 
    IIf(SubFolders, "/S", vbNullString) & " /B /A:-D").StdOut.ReadAll, vbCrLf), ":"), "#"), "#") 

End Function 

그러나 zip 파일에 대한

, 당신은 CreateObject("Shell.Application").Namespace(zipName).Items 방법보다이 다른 작업을 수행 할 수 있도록 윈도우 네이티브 아무것도 정말 없다.

나는, 무료 오픈 소스이며 (위처럼) 너무 CreateObject("WScript.Shell") 방법을 사용하여 VBA를 통해

+0

어이, 나는 x에서 파일 이름에 대한 루프 설정을 시도했다. 하지만 작동하지 않습니다 – DeerSpotter

+0

참조하십시오 : http://pastebin.com/03hcyzys – DeerSpotter

+0

@ MaximTeleguz 당신은 UDF를 포함하지 않았습니다. 하지만 우선, 문제가 구문이 아닌 새로운 질문으로 질문해야합니다. –

관련 문제