27. juni 2008 - 09:48Der er
4 kommentarer og 1 løsning
Traversering af mapper efter unikke filer, én folder ad gangen
Hej,
Jeg vil gerne ha' hjælp til at anvende Application.FileSearch, således at man i excel lister indholdet udtømmende af én undermappe, før man går videre til at liste næste undermappes indhold.
I sin standardfunktion er Application.Filesearch.Foundfiles desværre ikke sorteret i mappeorden - kan jeg det på en nem måde?
BAGGRUND: Min opgave er at traversere en gigantisk filstruktur igennem og identificere unikke filer. Jeg vil liste dubletter i et excel-ark med filnavn og placering. Dubletter skal efterfølgende IKKE indlæses i en intranet google search applikation.
Vi har haft en tendens til blot at gemme opdaterede filer i nye versioner i samme mappe som gamle filer. Derfor vil der i mange mapper ligge 20+ gamle versioner af samme fil, som ikke skal importeres.
Jeg vil finde den nyeste fil, og alene importere den (2 filer er "ens" hvis xx%(variabel, fx 80%) af et filnavn er ens, er de pr. definition ens, og jeg vil kun importere den senest modificerede af de to. Jeg ved at jeg rammer ved siden af i xx pct. af tilfældende, men det kan jeg leve med...
Min køreplan: Stien der skal analyseres = N:\dok I denne mappe ligger 50.000+ filer i mere end 1000 mapper/undermapper. Mappenivaeu er mange niveauer ned - fx 6 niveauer.
1. Find første undermappe, fx N:\dok\mappe1 2. Er der undermapper, find undermappe, fx N:\dok\mappe1\undermappe1\ 3. er der undermapper? NEJ - list i excel de fundne filer på hver sin linje. 4. Før man går til næste undermappe, udfør logik til at konkludere om der er tale om unikke filer.
For Each objFolder In objCurrentFolder.SubFolders FolderSize = objFolder.Size Tmp = (FormatNumber(FolderSize, 0, , , 0)/1024)/1024 ObjXL.ActiveSheet.Cells(icount,1).Value = objFolder.Path ObjXL.ActiveSheet.Cells(icount,2).Value = Tmp 'Wscript.Echo Tmp & " " & objFolder.Path 'raise counter with 1 for a new row in excel icount = icount + 1 Next
'Recurse through all of the folders For Each objNewFolder In objCurrentFolder.subFolders CheckFolder objNewFolder Next
'Finally close the workbook ObjXL.ActiveWorkbook.SaveAs(outputfile) ObjXL.Application.Quit Set ObjXL = Nothing
'Message when finished Set WshShell = CreateObject("WScript.Shell") Finished = Msgbox ("Script executed successfully, results can be found in " & Chr(10) _ & outputfile & "." & Chr(10) & Chr(10) _ & "Do you want to view the results now?", 65, "Script executed successfully!") if Finished = 1 then WshShell.Run "excel " & outputfile
Scriptet løber din filstryuktur igennem og generere et excelark med de filer det finder. Du kan blot modificere scriptet og ligge de kriterer ind som du vil have smidt ind i regnearket. F.eks ved at ligge en IF sætning ind.
Det virker. Tricket var selvfølgelig strukturen i Sub chechfolder, der indeholder et kald til sig selv m.
For Each objNewFolder In objCurrentFolder.subFolders CheckFolder objNewFolder Next
Det havde jeg glemt som løsningsmodel - tak for input. Herefter er det forholdsvist nemt at lave en kombination af file-search i den enkelte mappe (uden undermapper) og dernæst rekursivt kalde sig selv (CheckFolder) med hver identificeret undermappe og foretage samme gennemløb.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.