Verzeichnisbaum rekursiv durchgehen...

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Verzeichnisbaum rekursiv durchgehen...

Beitrag von AND51 »

Warum funktioniert das nicht? path.s ist am Anfang "C:\". Er schreibt immer "Invalid Memory Access."

Code: Alles auswählen

Procedure scan(path.s)
	Repeat
		ExamineDirectory(dir, path, "")
		Repeat
			Select NextDirectoryEntry()
				Case 2
					dir+1
					scan(path+DirectoryEntryName()+"\")
				Case 1
					If DirectoryEntryName() <> ".." And DirectoryEntryName() <> "."
						dateien+1
						SetGadgetText(#anz_dateien, "Dateien: "+Str(dateien))
						SetGadgetText(#datei, path+DirectoryEntryName())
					EndIf
				Default
					skip=1
					Quit=1
			EndSelect
		Until skip
		
	Delay(10)
	Until Quit
	ProcedureReturn 1
EndProcedure
Danke für eure Hilfe!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Weiß jetzt nicht genau aber es kann sein das du di scan Prozedure in der scan Procedure aufrufst ich glaube das geht so nicht!
So wie ich das hier mal gemacht habe:

Code: Alles auswählen

Procedure lol()
lol()
EndProcedure
lol()

Hoffe du weißt was ich meine!
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

roherter hat geschrieben:das du di scan Prozedure in der scan Procedure aufrufst ich glaube das geht so nicht!
Das geht, sonst wäre ja Rekursion überhaupt nicht möglich.

@AND51: habe gerade kein PB greifbar, aber bei ExamineDirectory musst Du m.E. mit #PB_ANY arbeiten. Und das aktuell bearbeitete Verzeichnis zu Anfang der Prozedur sichern und zu Ende der Prozedur wiederherstellen.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Verzeichnisbaum rekursiv durchgehen...

Beitrag von Kiffi »

> Er schreibt immer "Invalid Memory Access."

ja, hast Du Dir schon mal den Inhalt der Variable 'path' bei
ExamineDirectory(dir, path, "") angeschaut?

path = "C:\irgendeinpfad\.\.\.\.\.\.\.\.\.\.\.[undsoweiterundsofort...]"

das sollte helfen:

Code: Alles auswählen

[...]
If DirectoryEntryName() <> "." and DirectoryEntryName() <> ".."
  dir+1
  scan(path+DirectoryEntryName()+"\")
EndIf
[...]
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Roherter, trotzdem vielen Dank für deine Hilfe!

Ich habe das Problem gelöst!

@stbi: Dein zweiter Tipp mit dem Directory am Anfang sichern und am Ende wiederherzustellen, war Gold wert, aber wie soll das gehen, wenn ich #PB_any verwende?
Deshalb arbeite ich immer noch mir der Variablen dir, die ja bis 3 Mrd. geht, so habe ich das jetzt auf die schnelle im Kopf.

@ Kiffi: Deine Anregung habe ich auch übernommen, nämlich das ich die DirevtoryEntryName() namens "." und ".." rausfiltere.

Für alle, die es interessiert oder es vielleicht sogar selbst brauchen, hier der funktionierende Code:

Code: Alles auswählen

Procedure scan(path.s)
	old_dir=dir
	Repeat
		If ExamineDirectory(dir, path, "")
			Repeat
				Select NextDirectoryEntry()
					Case 2
						If DirectoryEntryName() <> ".." And DirectoryEntryName() <> "."; And FileSize(DirectoryEntryName()) = -2
							dir+1
							scan(path+DirectoryEntryName()+"\")
							UseDirectory(old_dir)
						EndIf
					Case 1
						If DirectoryEntryName() <> ".." And DirectoryEntryName() <> "."
							dateien+1
							SetGadgetText(#anz_dateien, "Dateien: "+Str(dateien))
							SetGadgetText(#datei, path+DirectoryEntryName())
						EndIf
					Default
						skip=1
						Quit=1
				EndSelect
			Until skip
		EndIf
		Delay(1)
	Until Quit
	ProcedureReturn 1
EndProcedure
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

AND51 hat geschrieben:Für alle, die es interessiert oder es vielleicht sogar selbst brauchen, hier der funktionierende Code:
:-)

Dein Engagement in Ehren, aber den Code gibt's bereits in grosser Anzahl
und Ausführung in diesem Board. ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

In meinem PreCompiler werden sogar je Rekursion verschiedene Dateien
geöffnet und geschlossen, ohne Invalid Memory Access :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
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
Antworten