Aua... Hilfe - Rekursion...

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
GrillenHirni
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 18. Jul 2013 11:56
Kontaktdaten:

Aua... Hilfe - Rekursion...

Beitrag 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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12940
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 20 Mal
Danksagung erhalten: 48 Mal

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

Beitrag 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/
gruss by OHR
Jimmy
GrillenHirni
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 18. Jul 2013 11:56
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 677
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 4 Mal
Danksagung erhalten: 109 Mal
Kontaktdaten:

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

Beitrag 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" )
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Antworten