08. november 2007 - 17:46Der er
10 kommentarer og 2 løsninger
Stier, mapper og rekursiv søgning heri
Hej
Jeg skal finde en bestemt type filer (.tmp) i nogle bestemte foldere (Middle) som skal kopieres til en destinationsfolder.
Mit problem er at det er noget kode som jeg skal refaktorere i Visual Basic (som jeg ikke rigtig kender).
Som det er nu, søges der kun i én bestemt sti, hvor "Middle" folderen er den sidste mappe i stien.
Der er dog kommet flere forskellige "Middle" foldere, og .tmp-filerne kan godt ligge i underfoldere til Middle. F. eks.:
\...\udv\Middle <-heri ligger .tmp filer \...\udv\Middle\Vims <-heri ligger .tmp filer \...\udv\Eks\Middle <-heri ligger .tmp filer
Da stien er den samme indtil og med \udv folderen må dette være et godt sted at starte.
Men hvordan implementerer jeg lige en løsning der hedder at jeg vil søge i Middle-foldere (samt underfoldere) efter tmp-filer.
Bemærk, at .tmp filer også findes i Eks folderen, men disse skal ikke med.
Jeg har søgt lidt på nettet og det ser ud til at FileSystemObject skulle kunne hjælpe mig. Men så vidt jeg kan se er det vbscript? Er der noget tilsvarende til VB? Arbejder i VS2005, og den kender i hvert fald ikke noget til FSO :-(
Håber mit problem er beskrevet godt nok. Ellers må I sige til.
Sub Main() Dim rootDi As DirectoryInfo = New DirectoryInfo("\...\udv\") ProcessDi(rootDi) End Sub
Sub ProcessDi(ByRef di As DirectoryInfo) For Each fi As FileInfo In di.GetFiles("*.tmp") ProcessFi(fi) Next
For Each subDi As DirectoryInfo In di.GetDirectories() ProcessDi(subDi) Next End Sub
Sub ProcessFi(ByRef fi As FileInfo) ' Oplysningerne om de enkelte filer kan findes i fi objektet. ' F.eks. kan du bruge fo.MoveTo(...) til at flytte filen til en anden lokation End Sub
Hej nielle Det har givet mig et skub i den rigtige retning. Sidder og fedter med det nu i hvert fald. Det kan godt være der kommer lidt spørgsmål senere. Men tak foreløbig.
Jeg sidder og tumler med at ikke kigge i de forkerte mapper. Altså der skal søges rekursivt, med undtagelser så at sige.
Som jeg skrev i det oprinde lige indlæg:
\...\udv\Middle <-heri ligger .tmp filer \...\udv\Middle\Vims <-heri ligger .tmp filer \...\udv\Eks\Middle <-heri ligger .tmp filer
Bemærk, at .tmp filer også findes i Eks folderen, men disse skal ikke med.
Altså jeg skal med andre ord søge fra og med Middle-folderen og så i underfoldere til disse (Middle).
Jeg er ikke helt klar over hvordan dette gøres. Jeg har prøvet at konvertere til strenge, og der er metoder som "Contains" og "EndsWith". Med EndsWith får jeg godt nok fat i de stier som slutter med navnet Middle, men jeg kan ikke lige greje at kigge efter *.tmp i underfoldere til Middle.
I øvrigt så gør jeg det ved at sige stringDir(i) = subDir.FullName (som giver stien) og ellers:
If (stringDir(i).ToString.EndsWith("Middle")) Then stringDir2(i) = stringDir(i) i += 1 End If
På den måde får jeg de dir-paths som ender med "Middle".
Men spørgsmålet er så om hvordan jeg gør den string-path til en property i et DirectoryInfo object igen? Man kan namelig ikke umiddelbart gøre det den anden vej, da property'en FullName er ReadOnly.
Jeg ville... I dette tilfælde... Foreslå arrays...
Du laver simpelthen et array af strings i starten. Dette er de mapper som du enten ikke vil have med, eller vil have med.
(Eksempler taget fra nielle)
Hvis det er dem du vil have med (Inkl. undermapper) så ved et tryk på en knap (Eller hvad der nu starter din process), så looper du arrayet og åbner et directoryinfo object for hver sti i arrayet. Dette objekt sender du videre til ProcessDi.
Hvis det er dem du ikke vil have med, så i starten af hver processdi, så checker du lige alle elementer i arrayet om deres string passer med mappen du har med at gøre. Derved vil du undgå at mapper der hedder det (Samt deres undermapper) bliver checket / scannet eller hvad nu vil.
> Men spørgsmålet er så om hvordan jeg gør den string-path til en property i et DirectoryInfo object igen? Man kan namelig ikke umiddelbart gøre det den anden vej, da property'en FullName er ReadOnly.
Kan du ikke lige reformulere den? Jeg tror ikke rigtigt at jeg forstår det. :^|
Mht. resten af din problemstilling, så ville jeg gribe den sådan her an:
Sub Main() Dim rootDi As DirectoryInfo = New DirectoryInfo("\...\udv\") ProcessDi(rootDi, False) End Sub
Sub ProcessDi(ByRef di As DirectoryInfo, ByVal subDirectories As Boolean) If di.Name = "Middle" Then subDirectories = True
For Each fi As FileInfo In di.GetFiles("*.tmp") ProcessFi(fi) Next
For Each subDi As DirectoryInfo In di.GetDirectories() ProcessDi(subDi, subDirectories) Next End Sub
Sub ProcessFi(ByRef fi As FileInfo) ' Oplysningerne om de enkelte filer kan findes i fi objektet. ' F.eks. kan du bruge fo.MoveTo(...) til at flytte filen til en anden lokation End Sub
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.