Aktuelle Zeit: 10.07.2020 17:20

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: rekursive Dateisuche
BeitragVerfasst: 25.05.2019 23:07 
Offline

Registriert: 06.03.2019 21:52
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:
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?

_________________
Der beste Fisch ist der Schnitzel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: rekursive Dateisuche
BeitragVerfasst: 25.05.2019 23:22 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
https://www.purebasic.fr/german/viewtopic.php?p=80742#p80742

Grüße ... Peter

_________________
Schrödingers Smiley :):


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: rekursive Dateisuche
BeitragVerfasst: 26.05.2019 03:50 
Offline
Benutzeravatar

Registriert: 10.10.2014 13:14
Wohnort: Wolfenbüttel
https://www.purebasic.fr/german/viewtopic.php?t=30731

_________________
weil einfach einfach einfach ist ... mach' ich es anders


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: rekursive Dateisuche
BeitragVerfasst: 30.05.2019 11:57 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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. :-)

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: rekursive Dateisuche
BeitragVerfasst: 31.05.2019 08:38 
Offline

Registriert: 29.08.2004 13:18
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!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: rekursive Dateisuche
BeitragVerfasst: 31.05.2019 13:08 
Offline

Registriert: 05.07.2009 17:51
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/CodesSources/DBComp.html
Im Text der Seite: Klicken Sie auf den Link: "5.2.3790.0 vom 24.03.2003"

Herzlich


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: rekursive Dateisuche
BeitragVerfasst: 31.05.2019 14:48 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
@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?)

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: rekursive Dateisuche
BeitragVerfasst: 31.05.2019 17:08 
Offline

Registriert: 30.03.2011 20:53
@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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: rekursive Dateisuche
BeitragVerfasst: 31.05.2019 20:24 
Offline

Registriert: 05.07.2009 17:51
Entschuldigung.
@ Nino, aber purebasic kann ein externes Programm verwenden, um eine Dateisuche mit Rekursion durchzuführen
Herzlich


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: rekursive Dateisuche
BeitragVerfasst: 31.05.2019 20:37 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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.

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye