Rekursives Auflisten aller Dateien und Ordner

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Frogger
Beiträge: 425
Registriert: 14.03.2006 19:27
Kontaktdaten:

Rekursives Auflisten aller Dateien und Ordner

Beitrag von Frogger »

Für Copy&Paste-Progger eine Procedure, die alle Dateien und Unterordner Auflistet.

Die Abfrage

Code: Alles auswählen

If FindString(dir$, "System Volume Information", 1) > 0 : ProcedureReturn 0 : EndIf
ist deshalb drin,da ExamineDirectory immer abbricht, wenn sie diesen Ordner übergeben bekommt.
Habe bisher noch keine andere Möglichkeit gefunden dies zu umgehen.
Ansonsten funktioniert die Proc. bei mir einwandfrei.

Viel Spass damit

Code: Alles auswählen

Declare ListDIR(dir$)

Structure count
  files.l
  dirs.l
EndStructure
Global NewList datei.s() ; hier sind alle gefundenen Dateien mit komplettem Pfad aufgelistet
Global NewList ordner.s() ; und hier alle Ordner
Global counter.count ; Anzahl der gefundenen Dateien und Ordner

Procedure ListDIR(dir$)
  If FindString(dir$, "System Volume Information", 1) > 0 : ProcedureReturn 0 : EndIf
  exdir = ExamineDirectory(#PB_Any, dir$, "*.*")
  If exdir
    While NextDirectoryEntry(exdir)      
      name$ = DirectoryEntryName(exdir)
      If name$ <> "." And name$ <> ".."
        If DirectoryEntryType(exdir) = #PB_DirectoryEntry_Directory
          FileName$ = dir$+name$+"\"
          AddElement(ordner())
          ordner() = FileName$
          counter.count\dirs = counter.count\dirs+1
          Debug FileName$
          ListDIR(FileName$)          
        Else          
          FileName$ = dir$+name$          
            AddElement(datei())
            datei() = FileName$
            counter.count\files = counter.count\files+1
            Debug FileName$
        EndIf
      EndIf
    Wend
    FinishDirectory(exdir)
  Else
    MessageRequester("Error","Ordner kann nicht geöffnet werden: "+dir$,0)
  EndIf
  ProcedureReturn 1
EndProcedure
Zuletzt geändert von Frogger am 03.12.2010 09:33, insgesamt 1-mal geändert.
[PB4.20]
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Rekursives Auflisten aller Dateien und Ordner

Beitrag von Kiffi »

Frogger hat geschrieben:Für Copy&Paste-Progger eine Procedure, die alle Dateien und Unterordner Auflistet.
mh, und was ist, wenn der Copy&Paste-Progger EnableExplicit verwenden?
Dann wäre Dir auch aufgefallen, dass bei Global counter.coun ein 't' fehlt ;-)

Du solltest auch darauf achten, dass der übergebene Ordner mit
einem Pfadtrenner endet (bzw. wenn er nicht da ist, automatisch
ergänzen). Sowas hier:

Code: Alles auswählen

ListDIR("M:\Projekte")
sollte korrekt verarbeitet werden werden.

Der MessageRequester kommt auch nicht so gut. Lieber einen Wert
ungleich 1 zurückgeben.

Die counter-Struktur benötigst Du auch nicht. Kann man mit ListSize(datei())
bzw. ListSize(ordner()) ermitteln. (in Deinem Fall wohl CountList())

Ansonsten könnte man auch noch überlegen, anstelle von zwei LinkedLists eine geschachtelte
zu verwenden. Aber Du hast ja anscheinend noch die V4.2 (wieso eigentlich?). Da gab es sowas ja noch nicht.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: Rekursives Auflisten aller Dateien und Ordner

Beitrag von AND51 »

Ähhh, Prozeduren, die Dateien und Ordner rekursiv auflisten, gibt es doch schon zu Hauf in diesem Forum? Viele von denen sind sogar performanter und handlicher als diese hier...?
Oder kann diese hier etwas, was all die anderen nicht können?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Frogger
Beiträge: 425
Registriert: 14.03.2006 19:27
Kontaktdaten:

Re: Rekursives Auflisten aller Dateien und Ordner

Beitrag von Frogger »

Dann wäre Dir auch aufgefallen, dass bei Global counter.coun ein 't' fehlt ;-)
Joa das kommt davon wenn man die Procedur kopiert und den Rest mal schnell hintippt...
Die counter-Struktur benötigst Du auch nicht. Kann man mit ListSize(datei())
bzw. ListSize(ordner()) ermitteln. (in Deinem Fall wohl CountList())
Den Counter benötige ich doch.
Ich lese und zeige die Anzahl meist in einem Thread an. Bisher hatte ich schon öfter IMA's wenn beim Suchen ein anderer Thread in die Liste eingreift.
Mit dem getrennten Counter hatte ich die Probleme bisher nicht.
Der MessageRequester kommt auch nicht so gut. Lieber einen Wert
ungleich 1 zurückgeben.
ListDIR(..) ruft sich immer wieder selbst auf mit einem anderen Pfad. Wocher willst du dann wissen bei welchem Ordner das ExamineDirectory() probleme macht?
Klar man könnte das auch über eine globale $-Variable machen und den Problempfad dort reinschreiben.
Danach sollte die Suche aber weitergehen und wenn der nächste kommt wird der letzte Ordner überschrieben.
Also müsstest du das ganze wieder in eine Liste schreiben und später auswerten wenn man möchte.


@AND51
Die Forensuche ist fürn Arsch.
Man sucht sich einen Wolf ab bis man etwas findet.
Könnte man nicht als Alternative die Google-Seitensuche ins Forum einbauen?
Sollte doch kein Prob seit
Ähhh, Prozeduren, die Dateien und Ordner rekursiv auflisten, gibt es doch schon zu Hauf in diesem Forum? Viele von denen sind sogar performanter und handlicher als diese hier...?
Oder kann diese hier etwas, was all die anderen nicht können?
Hab "auf die Schnelle" nur die von Kiffi gefunden. Der große Rest der Threads handeln über Probleme.
Was meinst du mit "handlicher" es ist doch wohl einfacher (für einen Anfänger) eine einzelne Procedure anzupassen als mehrere, die das selbe bewirken.
Kiffis Lösung mag zwar etwas schneller sein aber dafür schwieriger durchzublicken..
[PB4.20]
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Rekursives Auflisten aller Dateien und Ordner

Beitrag von Nino »

Frogger hat geschrieben:Die Forensuche ist fürn Arsch.
Man sucht sich einen Wolf ab bis man etwas findet.
Ich finde die Forensuche auch nicht besonders gut, aber diese Aussage halte ich doch für übertrieben. Wenn man z.B. nach dem Begriff rekursive Dateisuche sucht, findet man u.a. den betr. Code von Kiffi.
Frogger hat geschrieben:Könnte man nicht als Alternative die Google-Seitensuche ins Forum einbauen?
Sollte doch kein Prob seit
Es ist auch kein Problem, für Foreninhalte selbst die Google-Suche zu benutzen, z.B.:
rekursive Dateisuche site:purebasic.fr
Grüße, Nino
Benutzeravatar
Didelphodon
Beiträge: 360
Registriert: 18.12.2004 13:03
Wohnort: Wien
Kontaktdaten:

Re: Rekursives Auflisten aller Dateien und Ordner

Beitrag von Didelphodon »

Guckst Du hier.

LG Didel.
Das Leben ist ein sch*** Spiel, aber die Grafik ist irre!
Fighting for peace is like fuc*ing for virginity!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rekursives Auflisten aller Dateien und Ordner

Beitrag von STARGÅTE »

Frogger hat geschrieben: Die Abfrage [...] ist deshalb drin,da ExamineDirectory immer abbricht, wenn sie diesen Ordner übergeben bekommt.
Habe bisher noch keine andere Möglichkeit gefunden dies zu umgehen.
Zum Beispiel mit dem "dafür" vorgesehenden Befehl : DirectoryEntryAttributes(#Directory)

Dieser Rückgabewert würde dort nämlich #PB_FileSystem_System enthalten.

Hier ein Beispiel dazu:

Code: Alles auswählen

Procedure.s DirectoryEntryAttributesName(Directory.i)
  Protected String.s = " "
  Protected Attribute.i = DirectoryEntryAttributes(Directory)
  If Attribute & #PB_FileSystem_Hidden     : String + "Hidden "     : EndIf
  If Attribute & #PB_FileSystem_Archive    : String + "Archive "    : EndIf
  If Attribute & #PB_FileSystem_Compressed : String + "Compressed " : EndIf
  If Attribute & #PB_FileSystem_Normal     : String + "Normal "     : EndIf
  If Attribute & #PB_FileSystem_ReadOnly   : String + "ReadOnly "   : EndIf
  If Attribute & #PB_FileSystem_System     : String + "System "     : EndIf
  ProcedureReturn String
EndProcedure

Procedure Beispiel(Path.s)
  Protected Directory = ExamineDirectory(#PB_Any, Path, "*")
  If Directory
    While NextDirectoryEntry(Directory)
      Select DirectoryEntryType(Directory)
        Case #PB_DirectoryEntry_Directory
          Debug "'"+DirectoryEntryName(Directory)+"'  ("+DirectoryEntryAttributesName(Directory)+")"
        Case #PB_DirectoryEntry_File
;          Debug "'"+DirectoryEntryName(Directory)+"'  ("+DirectoryEntryAttributesName(Directory)+")"
      EndSelect
    Wend
  EndIf
EndProcedure

Beispiel("C:")
Ein Auszug aus "C:"
'Dokumente und Einstellungen' ( )
'Programme' ( ReadOnly )
'RECYCLER' ( Hidden System )
'System Volume Information' ( Hidden System )
'WINDOWS' ( )
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten