rekursive Dateisuche

Anfängerfragen zum Programmieren mit PureBasic.
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

rekursive Dateisuche

Beitrag 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?
Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: rekursive Dateisuche

Beitrag von Kiffi »

Hygge
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: rekursive Dateisuche

Beitrag von Imhotheb »

weil einfach einfach einfach ist ... mach' ich es anders
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: rekursive Dateisuche

Beitrag 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. :-)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: rekursive Dateisuche

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
kernadec
Beiträge: 25
Registriert: 05.07.2009 17:51

Re: rekursive Dateisuche

Beitrag 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
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: rekursive Dateisuche

Beitrag 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?)
matbal
Beiträge: 246
Registriert: 30.03.2011 20:53

Re: rekursive Dateisuche

Beitrag 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.
Benutzeravatar
kernadec
Beiträge: 25
Registriert: 05.07.2009 17:51

Re: rekursive Dateisuche

Beitrag von kernadec »

Entschuldigung.
@ Nino, aber purebasic kann ein externes Programm verwenden, um eine Dateisuche mit Rekursion durchzuführen
Herzlich
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: rekursive Dateisuche

Beitrag 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.
Antworten