Seite 1 von 2

Verzeichnisbaum rekursiv durchgehen...

Verfasst: 11.03.2006 22:29
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!

Verfasst: 11.03.2006 22:50
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!

Verfasst: 12.03.2006 00:29
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.

Re: Verzeichnisbaum rekursiv durchgehen...

Verfasst: 12.03.2006 00:41
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

Verfasst: 12.03.2006 16:09
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

Verfasst: 12.03.2006 17:57
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

Verfasst: 12.03.2006 18:14
von ts-soft
In meinem PreCompiler werden sogar je Rekursion verschiedene Dateien
geöffnet und geschlossen, ohne Invalid Memory Access :mrgreen:

Verfasst: 12.03.2006 20:20
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")

NextDirectoryEntry(UsedDirectory)

Verfasst: 12.03.2006 21:13
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.

Re: NextDirectoryEntry(UsedDirectory)

Verfasst: 12.03.2006 21:28
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.