Avatar billede mr.handstand Novice
27. juni 2008 - 09:48 Der 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.

Hjælp :o)
Avatar billede graspman Nybegynder
27. juni 2008 - 10:52 #1
Hej,

Du kan bruge dette VB script og tilrettet det:


  rootfolder = Inputbox("Enter directory/foldername: " & _
                        chr(10) & chr(10) & "(i.e. C:\Program Files or " & _
                        "\\Servername\C$\Program Files)" & chr(10) & chr(10), _
                        "Getfoldersize", "C:\Program Files")

  outputfile = "c:\foldersize_" & Day(now) & Month(now) & Year(now) & ".xls"

  Set fso = CreateObject("scripting.filesystemobject")
  if fso.fileexists(outputfile) then fso.deletefile(outputfile)

'Create Excel workbook
  set objXL = CreateObject( "Excel.Application" )
  objXL.Visible = False
  objXL.WorkBooks.Add

'Counter 1 for writing in cell A1 within the excel workbook
  icount = 1

'Run checkfolder
  CheckFolder (FSO.getfolder(rootfolder))

Sub CheckFolder(objCurrentFolder)

      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
     
End Sub


'sort data in excel
objXL.ActiveCell.CurrentRegion.Select
objXL.Selection.Sort objXL.Worksheets(1).Range("B1"), _
                  2, _
                  , _
                  , _
                  , _
                  , _
                  , _
                  0, _
                  1, _
                  False, _
                  1

'Lay out for Excel workbook
  objXL.Range("A1").Select
  objXL.Selection.EntireRow.Insert
  objXL.Selection.EntireRow.Insert
  objXL.Selection.EntireRow.Insert
  objXL.Selection.EntireRow.Insert
  objXL.Selection.EntireRow.Insert

  objXL.Columns(1).ColumnWidth = 60
  objXL.Columns(2).ColumnWidth = 15
  objXL.Columns(2).NumberFormat = "#,##0.0"
  objXL.Range("B1:B1").NumberFormat = "d-m-yyyy"
  objXL.Range("A1:B5").Select
  objXL.Selection.Font.Bold = True
  objXL.Range("A1:B3").Select
  objXL.Selection.Font.ColorIndex = 5
  objXL.Range("A1:A1").Select
  objXL.Selection.Font.Italic = True
  objXL.Selection.Font.Size = 16
  ObjXL.ActiveSheet.Cells(1,1).Value = "Survey FolderSize "
  ObjXL.ActiveSheet.Cells(1,2).Value = Day(now) & "-" & Month(now) & "-"& Year(now)
  ObjXL.ActiveSheet.Cells(3,1).Value = UCase(rootfolder)
  ObjXL.ActiveSheet.Cells(5,1).Value = "Folder"
  ObjXL.ActiveSheet.Cells(5,2).Value = "Total (MB)"


'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
Avatar billede graspman Nybegynder
27. juni 2008 - 10:54 #2
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.

Håber det kan bruges
Avatar billede mr.handstand Novice
27. juni 2008 - 18:35 #3
Tak for input - jeg prøver det lige af hen over weekenden og giver en tilbagemelding.
Avatar billede mr.handstand Novice
02. juli 2008 - 15:48 #4
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.

Jeg takker!
Avatar billede graspman Nybegynder
02. juli 2008 - 16:00 #5
welcome :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester