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:
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

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
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:
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.