Seite 1 von 1

Aua... Hilfe - Rekursion...

Verfasst: Do, 12. Okt 2023 19:40
von GrillenHirni
Liebe Programmierer

Ich würde gerne von einem bestimmten Verzeichnis aus in dem betreffenden
Verzeichnis und seinen Unterverzeichnissen eine Datei suchen, die in dieser
Struktur (Verzeichnisse und Unterverzeichnisse) auch mehrfach vorkommen
könnte. Die ganze Rekursion sollte mir ein Array mit den Treffern (Verzeichnis/Unterverzeichnisse,
in denen die betreffende Datei mit dem entsprechenden DateiNamen gefundenen wurde)
zurück geben.

Da ich mich nicht wundern würde, wenn sich schon mal jemand mit diesem
Problem beschäftigt hat, erlaube ich mir, hier anzufragen, ob diesbezüglich
bereits Erfahrungen vorhanden sind?

Ich wünsche allen einen schönen Abend und schicke herzliche Grüsse!
Grilli

Re: Aua... Hilfe - Rekursion...

Verfasst: Fr, 13. Okt 2023 9:32
von AUGE_OHR
hi Grilli,

so sammel ich Files ein

Code: Alles auswählen

STATIC aFilesCopy := {}
STATIC  nFilesSum  := 0
STATIC lOnlyNew = .F.

PROCEDURE MAIN
   ...
   // now search recursiv in Directory
   RECUDIRS( cFullSource + "\", "*.*","DHS" )

Code: Alles auswählen

FUNCTION Recudirs( cPath, cMask, cAttr )
LOCAL c_File
LOCAL n_Size
LOCAL c_Attr
LOCAL a_DIR
LOCAL n_LEN
LOCAL n_Count

   a_DIR := DIRECTORY( cPath + cMask, cAttr )
   n_LEN := LEN( a_DIR )

   FOR n_Count := 1 TO n_LEN
      c_File := a_DIR[ n_Count, F_NAME ]
      c_Attr := a_DIR[ n_Count, F_ATTR ]
      n_Size := a_DIR[ n_Count, F_SIZE ]

      IF ( c_File = ".." .AND. LEN( c_File ) = 2 ) .OR. ;
           ( c_File = "." .AND. LEN( c_File ) = 1 )
         LOOP
      ENDIF

      IF "D" $ c_Attr
         RECUDIRS( cPath + c_File + "\", cMask, cAttr )
      ELSE
         IF lOnlyNew = .T.                                            // if lOnlyNew
            IF "A" $ c_Attr                                           // it must have "A"
            ELSE
               LOOP
            ENDIF
         ENDIF

         AADD( aFilesCopy, { cPath, c_File, c_Attr, n_Size } )
         nFilesSum += n_Size
      ENDIF
   NEXT

RETURN .T.
p.s. mit "Everything" geht es in Sekunden, im Forum sollte es den Source für eine "Wrapper" geben
https://www.voidtools.com/downloads/

Re: Aua... Hilfe - Rekursion...

Verfasst: Fr, 13. Okt 2023 12:34
von GrillenHirni
Guten Tag Jimmy

Danke für die interessante Lösung!

Das geh ich heute im Sinne eines LernProzesses durch und bin Dir sehr dankbar!

Ein schönes WochenEnde und herzliche Grüsse
Grilli

Re: Aua... Hilfe - Rekursion...

Verfasst: Fr, 13. Okt 2023 12:46
von nightcrawler
mit einer Änderung: Ich würde für die Liste "aFilesCopy" kein static nehmen, sondern eher das Array in der Funktion erstellen und dann zum Verbinden zurückliefern.

Code: Alles auswählen

aFilesCopy := RECUDIRS( cFullSource + "\", "*.*","DHS" )