DirectoryEntrySize() rekursiv ?
- Pr0fessor
- Beiträge: 40
- Registriert: 21.07.2011 16:13
- Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
- Wohnort: Hagenow
- Kontaktdaten:
DirectoryEntrySize() rekursiv ?
huhu.....
welche möglichkeit(en) gibt es um die Größe eines verzeichnisses inkl.aller unterverzeichnisse + die darin liegenden Dateien anzeigen zu lassen?
muss ich da jede einzelne Datei einlesen und überprüfen ob ein verzeichnis vorkommt und wenn ja dieses Verzeichnis bzw. den namen an den vorher festgelegten pfad "ankleben"?
welche möglichkeit(en) gibt es um die Größe eines verzeichnisses inkl.aller unterverzeichnisse + die darin liegenden Dateien anzeigen zu lassen?
muss ich da jede einzelne Datei einlesen und überprüfen ob ein verzeichnis vorkommt und wenn ja dieses Verzeichnis bzw. den namen an den vorher festgelegten pfad "ankleben"?
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Re: DirectoryEntrySize() rekursiv ?
Ja, da musst tatsächlich alle Dateien inklusive Unterverzeichnisse durchscannen und dabei zählen.
Falls du nicht weißt, wie du rekursiv suchen kannst: Suche nach "rekursiv suchen"
Falls du nicht weißt, wie du rekursiv suchen kannst: Suche nach "rekursiv suchen"
Re: DirectoryEntrySize() rekursiv ?
Ein paar nützliche Informationen dazu bzw. Dinge, die man (unter Windows) bedenken sollte:
http://blogs.msdn.com/b/oldnewthing/arc ... 36219.aspx
http://blogs.msdn.com/b/oldnewthing/arc ... 36219.aspx
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
- Pr0fessor
- Beiträge: 40
- Registriert: 21.07.2011 16:13
- Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
- Wohnort: Hagenow
- Kontaktdaten:
Re: DirectoryEntrySize() rekursiv ?
also folgendes ermittelt ja die größe auf flacher ebene - also nicht rekursiv:
nun müsste ich ja folgendes noch einfügen:
nunja - ist nur ein erster gedanke und wird sehr wahrsceinlich nicht funktionieren - aber die richtung ist doch schonmal gut oder?
aber ich hab auch was gelesen von:
... if DirectoryEntryName(0) <> "." and ".." ; irgendwas
was bringt das ?
und warum so kompliziert wenn man das doch auch als schöne funktion implementieren könnte?
Code: Alles auswählen
Directory$ = "c:\"
gr.f = 0
If ExamineDirectory(0, Directory$,"")
While NextDirectoryEntry(0)
gr.f = gr.f + DirectoryEntrySize(0)
Wend
FinishDirectory(0)
Debug "gesamt " + StrF(gr.f / 1024 / 1024)
EndIf
Code: Alles auswählen
If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
Directory$ = Directory$ + DirectoryEntryName(0) + "\"
aber ich hab auch was gelesen von:
... if DirectoryEntryName(0) <> "." and ".." ; irgendwas
was bringt das ?
und warum so kompliziert wenn man das doch auch als schöne funktion implementieren könnte?
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Re: DirectoryEntrySize() rekursiv ?
Die "Verzeichnisse" "." und ".." sind nur fürs Springen zuständig. Z.B. bedeutet ".." ein Verzeichnis aufwärts. Kann man u.a. auch gerne in einem Pfad angeben. Daher kannst du diese "Verzeichnisse" ignorieren.
Bei einer rekursiven Suche musst du ja deine eigene Suchprozedur selbst aufrufen, damit alle Tiefen eines Verzeichnisses geöffnet und gelesen werden.
Schau dir einfach die folgenden Beispiele an:
http://www.purebasic.fr/german/viewtopi ... =8&t=23553
http://www.purebasic.fr/german/viewtopi ... =8&t=11150
http://www.purebasic.fr/german/viewtopi ... 03#p152103
[...]
Bei einer rekursiven Suche musst du ja deine eigene Suchprozedur selbst aufrufen, damit alle Tiefen eines Verzeichnisses geöffnet und gelesen werden.
Schau dir einfach die folgenden Beispiele an:
http://www.purebasic.fr/german/viewtopi ... =8&t=23553
http://www.purebasic.fr/german/viewtopi ... =8&t=11150
http://www.purebasic.fr/german/viewtopi ... 03#p152103
[...]
- Pr0fessor
- Beiträge: 40
- Registriert: 21.07.2011 16:13
- Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
- Wohnort: Hagenow
- Kontaktdaten:
Re: DirectoryEntrySize() rekursiv ?
danke dir für die links (die ich mir schon anschaute)
und... kann mir jemand vielleicht wenn er genug zeit und lust hat, mir das durchsuchen (rekursiv) erklären?
kann man soetwas irgendwo nachlesen?Die "Verzeichnisse" "." und ".." sind nur fürs Springen zuständig
und... kann mir jemand vielleicht wenn er genug zeit und lust hat, mir das durchsuchen (rekursiv) erklären?
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Re: DirectoryEntrySize() rekursiv ?
Wenn du dich im Verzeichnis "C:\Users\User\Desktop\TestOrdner\" befindest und du hast dort eine PB-Datei, die auf eine Grafik, die sich in einem anderen Verzeichnis "C:\Users\User\Desktop\TestOrdner2\" befindet, zugreifen soll, aber du möchtest aber keinen absoluten (vollständigen) Pfad verwenden, dann nimmst du da einen relativen Pfad.
Um nun auf die gewünschte Grafik zugreifen zu können, kannst du, ohne einen vollständigen Pfad angeben zu müssen, folgendes angeben: "..\TestOrdner2\Grafik.png"
D.h.:
1. Die Anwendung geht ein Verzeichnis aufwärts: "C:\Users\User\Desktop\"
2. Dort geht er anschließend ins Verzeichnis: "C:\Users\User\Desktop\TestOrdner2\"
Da hast du nun Zugriff auf die gewünschte Datei.
Ist es verständlich für dich?

Du hast eine Such-Prozedur, die nur in der Lage ist, alle Dateien in einem einzigen Verzeichnis zu durchsuchen.
Um nun auch andere Dateien, die sich in anderen Verzeichnissen befinden, ebenfalls zu durchsuchen, musst du die selbe Such-Prozedur innerhalb der Such-Prozedur erneut öffnen, um dieses Verzeichnis ebenfalls durchsuchen zu können. D.h. deine Such-Prozedur kann nur immer eine Tiefe eines Verzeichnisses durchsuchen, also alle Dateien, die sich in diesem Verzeichnis befinden.
Mit DirectoryEntryType() kannst du ermitteln, ob es sich um eine Datei oder um ein Verzeichnis handelt. Wenn es eine Datei ist (#PB_DirectoryEntry_File), dann soll er einfach die angegebene Datei auslesen. Wenn es aber ein Verzeichnis ist (#PB_DirectoryEntry_Directory), dann soll er die selbe Such-Prozedur öffnen und du übergibst den aktuellen Pfad des Verzeichnisses, damit deine Such-Prozedur in diesem Verzeichnis ebenfalls nach allen Dateien durchsuchen kann. Wenn in diesem Ordner noch ein Unterverzeichnis vorhanden ist, dann öffnest du wieder deine eigene Such-Prozedur und übergibst den Pfad dieses Ordners.
Und es geht immer so weiter, bis alle Dateien und alle Verzeichnisse vollständig durchsucht wurden.
Ich hoffe, du kannst das jetzt nachvollziehen, wie das ungefähr funktioniert.
Um nun auf die gewünschte Grafik zugreifen zu können, kannst du, ohne einen vollständigen Pfad angeben zu müssen, folgendes angeben: "..\TestOrdner2\Grafik.png"
D.h.:
1. Die Anwendung geht ein Verzeichnis aufwärts: "C:\Users\User\Desktop\"
2. Dort geht er anschließend ins Verzeichnis: "C:\Users\User\Desktop\TestOrdner2\"
Da hast du nun Zugriff auf die gewünschte Datei.
Ist es verständlich für dich?
Ich versuchs.Pr0fessor hat geschrieben:kann mir jemand vielleicht wenn er genug zeit und lust hat, mir das durchsuchen (rekursiv) erklären?

Du hast eine Such-Prozedur, die nur in der Lage ist, alle Dateien in einem einzigen Verzeichnis zu durchsuchen.
Um nun auch andere Dateien, die sich in anderen Verzeichnissen befinden, ebenfalls zu durchsuchen, musst du die selbe Such-Prozedur innerhalb der Such-Prozedur erneut öffnen, um dieses Verzeichnis ebenfalls durchsuchen zu können. D.h. deine Such-Prozedur kann nur immer eine Tiefe eines Verzeichnisses durchsuchen, also alle Dateien, die sich in diesem Verzeichnis befinden.
Mit DirectoryEntryType() kannst du ermitteln, ob es sich um eine Datei oder um ein Verzeichnis handelt. Wenn es eine Datei ist (#PB_DirectoryEntry_File), dann soll er einfach die angegebene Datei auslesen. Wenn es aber ein Verzeichnis ist (#PB_DirectoryEntry_Directory), dann soll er die selbe Such-Prozedur öffnen und du übergibst den aktuellen Pfad des Verzeichnisses, damit deine Such-Prozedur in diesem Verzeichnis ebenfalls nach allen Dateien durchsuchen kann. Wenn in diesem Ordner noch ein Unterverzeichnis vorhanden ist, dann öffnest du wieder deine eigene Such-Prozedur und übergibst den Pfad dieses Ordners.
Und es geht immer so weiter, bis alle Dateien und alle Verzeichnisse vollständig durchsucht wurden.
Ich hoffe, du kannst das jetzt nachvollziehen, wie das ungefähr funktioniert.
- Pr0fessor
- Beiträge: 40
- Registriert: 21.07.2011 16:13
- Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
- Wohnort: Hagenow
- Kontaktdaten:
Re: DirectoryEntrySize() rekursiv ?
ja danke.
aber wenn ich das verzeichnis übergebe wechselt er ja jeweils eine ebene tiefer, aber wie kommt er wieder zurück um die restlichen verzeichnisse zu durchsuchen?
denn wenn ich innerhalb des while : wend schleife einfach Directory$ = Directory$ + DirectoryEntryName(0) + "\" ausführe klappts nicht, was ja auch irgendwo logisch ist......
aber wenn ich das verzeichnis übergebe wechselt er ja jeweils eine ebene tiefer, aber wie kommt er wieder zurück um die restlichen verzeichnisse zu durchsuchen?
denn wenn ich innerhalb des while : wend schleife einfach Directory$ = Directory$ + DirectoryEntryName(0) + "\" ausführe klappts nicht, was ja auch irgendwo logisch ist......
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Re: DirectoryEntrySize() rekursiv ?
Das passiert automatisch (siehe Beispielcodes, die ich oben verlinkt habe), weil die Such-Prozedur ja keine Endlosschleife ist, sondern er durchsucht so lange, bis alle Dateien und Verzeichnisse aufgelistet sind. Wenn alle Dateien eines Unter-Ordners aufgelistet wurden, dann wird die aktuelle aufgerufene Such-Prozedur geschlossen und er setzt mit dem Suchen mit dem Verzeichnis (Ebene höher) fort, bis er auch dort alle Dateien durchsucht wurden.
Beispiel:
Beispiel:
- C:\
- C:\abc\
- C:\def\
- C:\def\Programme\
- C:\def\Sonstiges\
- C:\ghi\
- C:\jkl\Informationen\
- C:\mno\
- Ende
- captain_hesse
- Beiträge: 138
- Registriert: 17.05.2009 18:55
- Computerausstattung: Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
- Wohnort: Saarland
Re: DirectoryEntrySize() rekursiv ?
Hallo
Ich habe da noch was in meinem Archiv gefunden wo ich schonmal damit herum experimentiert habe, diese Variante sucht nach .tmp dateien auf dem Laufwertk C.
vielleicht hilft es dir ja weiter.viele Grüße
Armin
Ich habe da noch was in meinem Archiv gefunden wo ich schonmal damit herum experimentiert habe, diese Variante sucht nach .tmp dateien auf dem Laufwertk C.
vielleicht hilft es dir ja weiter.
Code: Alles auswählen
OpenConsole()
ConsoleTitle("Console")
EnableGraphicalConsole(1)
Declare rec(dir$,ti)
ti=0
Global NewList dateien.s()
Global dat=0
Global size.q=0
dir$="C:\"
PrintN("Bitte warten Suche ist am laufen !" )
rec(dir$,ti)
ForEach dateien()
PrintN(dateien())
Next
Ergebnis = ListSize(dateien())
PrintN("------------------------------------------------------------------------------")
PrintN("Fertig "+Str(dat)+" Dateien durchsucht insgesammt"+" "+Str(size)+" Bytes")
PrintN(Str(ergebnis)+" *.tmp Dateien gefunden")
Input()
Procedure rec(dir$,ti)
ti+1
dirz$=dir$
If ExamineDirectory(ti, dir$, "")
While NextDirectoryEntry(ti)
If DirectoryEntryType(ti) = #PB_DirectoryEntry_File
dat+1
text$=DirectoryEntryName(ti)
size+FileSize(dir$+text$)
If FindString(text$,".tmp",Len(text$)-4)
AddElement(dateien())
dateien()=dir$+text$
;PrintN(dir$)
;PrintN("")
;Input()
EndIf
Else
If DirectoryEntryName(ti)<>"." And DirectoryEntryName(ti)<>".."
dir$+DirectoryEntryName(ti)+"\"
;PrintN(dir$)
rec(dir$,ti)
EndIf
EndIf
dir$=dirz$
Wend
FinishDirectory(ti)
EndIf
EndProcedure
Armin
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)