Avatar billede mgsj Nybegynder
08. november 2007 - 17:46 Der 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.
Avatar billede nielle Nybegynder
08. november 2007 - 18:08 #1
Noget i denne stil?

    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
Avatar billede mgsj Nybegynder
12. november 2007 - 14:24 #2
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.
Avatar billede nielle Nybegynder
12. november 2007 - 18:16 #3
Det var også kun tænkt som skelettet til en løsning til at starte med. Du spørger bare hvis der er noget. :^)
Avatar billede mgsj Nybegynder
14. november 2007 - 14:51 #4
Hej

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.

Eller tænker jeg i forkerte baner?
Avatar billede lord_mike Nybegynder
14. november 2007 - 16:17 #5
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.
Avatar billede nielle Nybegynder
16. november 2007 - 20:58 #6
> 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
Avatar billede mgsj Nybegynder
19. november 2007 - 13:30 #7
Både Nielle og lord mike. I skal have 1000 tak for hjælpen.
Nedenstående kode virker tilsyneladende efter hensigten :-D

    Sub ProcessDi(ByRef di As DirectoryInfo, ByVal subDirectories As Boolean)

        If (di.Name = "Middle") Then subDirectories = True

        If subDirectories = True Then
            For Each fi As FileInfo In di.GetFiles("*.tmp")
                ProcessFi(fi)
            Next
        End If

        For Each subDi As DirectoryInfo In di.GetDirectories()
            ProcessDi(subDi, subDirectories)

        Next

    End Sub

Kan I smide et svar?
Avatar billede lord_mike Nybegynder
19. november 2007 - 16:55 #8
Here ya go...

Held og lykke fremover :)
Avatar billede nielle Nybegynder
19. november 2007 - 18:14 #9
Svar :^)
Avatar billede nielle Nybegynder
26. november 2007 - 17:22 #10
Så mangler du bare at acceptere :^)
Avatar billede mgsj Nybegynder
26. november 2007 - 19:14 #11
Ups! Men nu skulle den være i vinkel. Endnu engang tak for hjælpen.
Avatar billede nielle Nybegynder
26. november 2007 - 21:35 #12
Takker for point :^)
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
Kurser inden for grundlæggende programmering

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