Seite 1 von 2

rekursive Dateisuche

Verfasst: 25.05.2019 23:07
von bin_neu_hier
Hallo Leute,

konnte zwar irgendwo im Board finden, dass das Thema "rekursive Dateisuche" jetzt (also damals) ausreichend diskutiert sei und man sich darüber nicht mehr auszulassen brauche, aber irgendwie finde ich keine Beispiele, die auf dem aktuellen PB laufen und (von mir, immernoch Anfänger) an meine Bedürfnisse angepasst werden könnten.

Habe deswegen das Beispiel aus der Hilfe für mich wie folgt angepasst:

Code: Alles auswählen

Enumeration
  #dir1
  #dir2
EndEnumeration

Global dirlist$
Global filelist$

Procedure readfiles (ppath$)
  ExamineDirectory(#dir2, ppath$, "*.*")
  While NextDirectoryEntry(#dir2)      ;<- an dieser Stelle kommt immer der Compiler-Error "directory is not initialized"
    If DirectoryEntryType(#dir2) = #PB_DirectoryEntry_File
      filelist$ = filelist$ + ppath$ + DirectoryEntryName(#dir2)+"|"
    EndIf
  Wend
  FinishDirectory(#dir2)
EndProcedure

Procedure readdirs (ppath$)
  ExamineDirectory(#dir1, ppath$, "*.*")
  While NextDirectoryEntry(#dir1)
    If DirectoryEntryType(#dir1) = #PB_DirectoryEntry_Directory And Left(DirectoryEntryName(#dir1),1)<>"."
      dirlist$ = dirlist$ + DirectoryEntryName(#dir1)+"\|"
    EndIf
  Wend
  FinishDirectory(#dir1)
EndProcedure

;--------------------------

dirlist$ = ""
filelist$ = ""
pfad$ = "C:\Users\chef\Documents\"

readdirs (pfad$) 
; liest alle vorhandenen Unterverzeichnisse in "C:\Users\chef\Documents\", mit "|" getrennt in der Variablen dirlist$ gespeichert

n = CountString(dirlist$, "|")
For i = 1 To n
  x$ = StringField(dirlist$, i, "|")
  readfiles (pfad$ + x$)             ;liest für jedes Unterverzeichnis alle vorhandenen Dateien ein, mit "|" getrennt in filelist$ gespeichert
Next

n = CountString(filelist$, "|")
For i = 1 To n
  x$ = StringField(filelist$,i,"|")
  debug x$           ;<- würde alle Dateien mit vollständigem Pfad ausgeben, wenns funktionieren würde
Next

Damit bin zwar noch meilenweit von rekursiv weg, es würde aber für mein aktuelles Projekt ausreichen - wenns funktionieren würde! Warum kommt jedesmal die Fehlermeldung "Verzeichnis nicht initialisiert" und was könnte man dagegen tun?

Re: rekursive Dateisuche

Verfasst: 25.05.2019 23:22
von Kiffi

Re: rekursive Dateisuche

Verfasst: 26.05.2019 03:50
von Imhotheb

Re: rekursive Dateisuche

Verfasst: 30.05.2019 11:57
von Nino
bin_neu_hier hat geschrieben:finde ich keine Beispiele, die auf dem aktuellen PB laufen und (von mir, immernoch Anfänger) an meine Bedürfnisse angepasst werden könnten.
Ein rekursives Programm an die eigenen Bedürfnisse anpassen ist auch nicht unbedingt eine Aufgabe für Anfänger. :-)

Re: rekursive Dateisuche

Verfasst: 31.05.2019 08:38
von GPI
Ein paar Verbesserungsvorschläge:

Du hängst die Dateien und Ordner immer an einen String ran. Das funktioniert bei kleinen Verzeichnissen noch gut, wenn du ab ein großes Verzeichnis hast, wird das sehr schnell sehr sehr langsam. Bei jeden Anhängen wird der ursprüngliche String kopiert.
Auch Stringfield() ist eine ehe langsame Funktion.
Auch kannst du nicht die Einträge später sortieren. Nicht vergessen, das die Einträge in Alphabetischer Reihenfolge kommen, liegt an Betriebsystem und den benutzten Dateisystem. Bei USB-Sticks und SD-Karten kann sich das schnell ändern!

Besser ist es in eine Linked List abzulegen. Die haben eine variable Größe und du kann mittels AddElemen() sehr schnell neue Einträge einfügen. Mit ForEach:Next kannst du auch schnell alle ausgeben.

Eine Datei/Verzeichnis kann durchaus mit einen "." beginnen. Die komplett rauszufiltern kann ein Fehler sein, den du später nur sehr schwer findest.

Wenn du eine echte Rekursive-Funktion (sich selbst aufrufend) machst, solltest du dringend folgendes beachten: Es gibt Ordner-Links und die können auf einen "Eltern-Ordner" verweisen. Die Ordner können so einen Kreis bilden. Die einzige Möglichkeit, das zuverlässig zu erkennen sind Windows-API-Funktionen. Eine andere Möglichkeit wäre, eine Tiefenbegrenzung einzubauen, das nur 20 Ordner tief gesucht wird oder so. Dann hast du zwar immer noch das Problem, das Dateien / Ordner mehrfach drin sind, aber der Code läuft nicht endlos weiter.

Re: rekursive Dateisuche

Verfasst: 31.05.2019 13:08
von kernadec
Hallo
Diese Art von Programmen für die Suche mit Unterverzeichnisoptionen ist vorhanden
Microsoft heißt: "Windiff.exe" auf Windows XP-CDs,
Also, wenn Sie eine Windows XP-CD haben
Auf der Archiv-CD befindet sich: \ WINXP \ support \ tools \ support.cab
In diesem Archiv müssen Sie 3 Dateien wiederherstellen:
windiff.exe 105 984 Bytes
windiff.hlp 17.357 Bytes
gutils.dll 41 472 Bytes

ansonsten for welchen, die keine XP-CD haben,
Ich fand auf diesem Link, "Windiff.exe", gibt es 2 Dateien,
Die in der ausführbaren Datei windiff.exe enthaltenen Bibliothek "gutils.dll" Enthusiasten insgesamt 140.288 Byte

http://patrice.dargenton.free.fr/CodesS ... BComp.html
Im Text der Seite: Klicken Sie auf den Link: "5.2.3790.0 vom 24.03.2003"

Herzlich

Re: rekursive Dateisuche

Verfasst: 31.05.2019 14:48
von Nino
@kernadec:

Sorry, du hast anscheinend das Thema dieses Threads nicht verstanden.

1) Es geht hier nicht um fertige Programme, sondern um PureBasic-Code.
2) Es geht hier nicht um den Vergleich von Dateien.
3) Heute, im Jahr 2019, ist Windows XP völlig obsolet. Es (oder Teile daraus) zu empfehlen ist nicht sinnvoll.

(Oder ist das ein Bot, der seit 10 Jahren unentdeckt geblieben ist?)

Re: rekursive Dateisuche

Verfasst: 31.05.2019 17:08
von matbal
@bin_neu_hier

Du hast in beiden Prozeduren vergessen, den Rückgabewert von ExamineDirectory() zu überprüfen. Daher kommt auch der Fehler eine Zeile später bei NextDirectoryEntry().

Bei Links gibt ExamineDirecotry() nämlich 0 (= Fehler) zurück.

Re: rekursive Dateisuche

Verfasst: 31.05.2019 20:24
von kernadec
Entschuldigung.
@ Nino, aber purebasic kann ein externes Programm verwenden, um eine Dateisuche mit Rekursion durchzuführen
Herzlich

Re: rekursive Dateisuche

Verfasst: 31.05.2019 20:37
von Nino
kernadec hat geschrieben:@ Nino, aber purebasic kann ein externes Programm verwenden, um eine Dateisuche mit Rekursion durchzuführen
Das ist richtig, und PureBasic kann auch noch vieles mehr.
Aber ... siehe meine vorangegangene Nachricht.