Verzeichnisbaum rekursiv durchgehen...

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

Warum so kompliziert? Die dynamische Indizierung mit #PB_Any kann einem manchmal ganz schön viel Arbeit abnehmen:

Code: Alles auswählen

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

Procedure ListFiles(EntryPath.s)

  EntryPath + "\"

  UsedDirectory = ExamineDirectory(#PB_Any, EntryPath, "*.*")

  While NextDirectoryEntry(UsedDirectory)

    EntryType.l = DirectoryEntryType(UsedDirectory)
    EntryName.s = DirectoryEntryName(UsedDirectory)

    If EntryName = "." Or EntryName = "..": Continue: EndIf

    If EntryType = #PB_DirectoryEntry_File: Debug "File: " + EntryPath + EntryName: EndIf
    If EntryType = #PB_DirectoryEntry_Directory: ListFiles(EntryPath + EntryName): EndIf

  Wend: FinishDirectory(UsedDirectory)

EndProcedure

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

ListFiles("c:\windows")
Zuletzt geändert von Lebostein am 13.03.2006 10:19, insgesamt 1-mal geändert.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

NextDirectoryEntry(UsedDirectory)

Beitrag von AND51 »

Code: Alles auswählen

NextDirectoryEntry(UsedDirectory)
Ist das schon für PB 4 ? Das habe ich nämlich nicht und deswegen funzt es nicht, aber du hast Recht: Es ist wirklich sehr, sehr viel einfacher als meines.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: NextDirectoryEntry(UsedDirectory)

Beitrag von STARGÅTE »

AND51 hat geschrieben:

Code: Alles auswählen

NextDirectoryEntry(UsedDirectory)
Ist das schon für PB 4 ? Das habe ich nämlich nicht und deswegen funzt es nicht, aber du hast Recht: Es ist wirklich sehr, sehr viel einfacher als meines.
also bei 3.3 ist es noch ohne Parameter aber es exestiert schon.
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
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

Hier das gleiche mit PB 3.X, leider gibt es hier noch keinen Befehl, um ein Suchverzeichnis wieder zu entfernen (FinishDirectory)

Code: Alles auswählen

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

Procedure ListFiles(EntryPath.s)

  EntryPath + "\"

  UsedDirectory = ExamineDirectory(#PB_Any, EntryPath, "*.*")

  Repeat: UseDirectory(UsedDirectory)

    EntryType.l = NextDirectoryEntry(): If EntryType = 0: Break: EndIf
    EntryName.s = DirectoryEntryName()

    If EntryName = "." Or EntryName = "..": Continue: EndIf

    If EntryType = 1: Debug "File: " + EntryPath + EntryName: EndIf
    If EntryType = 2: ListFiles(EntryPath + EntryName): EndIf

  ForEver

EndProcedure

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

ListFiles("c:\windows")
Renovatio

Re: Verzeichnisbaum rekursiv durchgehen...

Beitrag von Renovatio »

Ich habe mir mal diesen Code kopiert und an meine Bedürfnisse angepasst, nur funktioniert das jetzt nicht immer.
Meine Anwendung hängt sich dann bei bestimmten Verzeichnissen auf.

Bekomme auch folgenden Fehler: Das angegebene #Directory ist nicht initialisiert

Woran kann das liegen?


Hier ist der Code

Code: Alles auswählen

Procedure FileManager_CheckFiles(Path$)
	
	Path$ + "\"
	Files = 0
	
	Dir = ExamineDirectory(#PB_Any, Path$, "*.*")
	
	While NextDirectoryEntry(Dir)
		
		Name$ = DirectoryEntryName(Dir)
		Type = DirectoryEntryType(Dir)
		Size = (DirectoryEntrySize(Dir) / 1024) / 1024
		
		If Name$ = "." Or Name$ = ".." : Continue : EndIf
		
		If Type = #PB_DirectoryEntry_File
			
			FileManager_Files + 1
			FileManager_TotalSize + Size
			
			FileType$ = Right(Name$, 4)
			
			AddGadgetItem(#GadgetVideosFiles, -1, RemoveString(Name$, FileType$) + Chr(10) + Str(Size) + " MB" + Chr(10) + UCase(FileType$) + "-Datei")
			
		EndIf
		If Type = #PB_DirectoryEntry_Directory
			
			FileManager_CheckFiles(Path$ + Name$)
			
		EndIf
		
	Wend
	
	FinishDirectory(Dir)
	
EndProcedure

Bei dem Pfad -> "F:\02 » Movies\Filme" funktioniert's und bei allen anderen die mit C zu tun haben leider nicht.


Gruß

Renovatio
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Verzeichnisbaum rekursiv durchgehen...

Beitrag von STARGÅTE »

An deiner Stelle würde ich einfach mal prüfen ob ExamineDirectory() erfolgreich war!
Wenn nicht, ist es natürlich klar, das dann das folgende NextDirectoryEntry() einen fehler verurscht.

Beispiel: "C:\System Volume Information" wird als Ordner erkannt, kann aber nicht gelesen werden.

Also einfach ein "If Dir" mit einbauen.
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
Renovatio

Re: Verzeichnisbaum rekursiv durchgehen...

Beitrag von Renovatio »

STARGÅTE hat geschrieben:An deiner Stelle würde ich einfach mal prüfen ob ExamineDirectory() erfolgreich war!
Wenn nicht, ist es natürlich klar, das dann das folgende NextDirectoryEntry() einen fehler verurscht.

Beispiel: "C:\System Volume Information" wird als Ordner erkannt, kann aber nicht gelesen werden.

Also einfach ein "If Dir" mit einbauen.
Ja ! Affengeil ! xD

Wie immer besten Dank für diese schnelle Hilfe!

Wie oft man den Wald vor lauter Bäumen nicht sehen kann?!
Antworten