Seite 1 von 2

DirectoryEntrySize() rekursiv ?

Verfasst: 15.06.2012 20:16
von Pr0fessor
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"?

Re: DirectoryEntrySize() rekursiv ?

Verfasst: 15.06.2012 20:17
von RSBasic
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"

Re: DirectoryEntrySize() rekursiv ?

Verfasst: 15.06.2012 20:46
von c4s
Ein paar nützliche Informationen dazu bzw. Dinge, die man (unter Windows) bedenken sollte:
http://blogs.msdn.com/b/oldnewthing/arc ... 36219.aspx

Re: DirectoryEntrySize() rekursiv ?

Verfasst: 15.06.2012 22:35
von Pr0fessor
also folgendes ermittelt ja die größe auf flacher ebene - also nicht rekursiv:

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
nun müsste ich ja folgendes noch einfügen:

Code: Alles auswählen

 If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
        Directory$ = Directory$ + DirectoryEntryName(0) + "\"
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?

Re: DirectoryEntrySize() rekursiv ?

Verfasst: 15.06.2012 22:40
von RSBasic
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
[...]

Re: DirectoryEntrySize() rekursiv ?

Verfasst: 16.06.2012 18:20
von Pr0fessor
danke dir für die links (die ich mir schon anschaute)
Die "Verzeichnisse" "." und ".." sind nur fürs Springen zuständig
kann man soetwas irgendwo nachlesen?


und... kann mir jemand vielleicht wenn er genug zeit und lust hat, mir das durchsuchen (rekursiv) erklären?

Re: DirectoryEntrySize() rekursiv ?

Verfasst: 16.06.2012 18:36
von RSBasic
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?
Pr0fessor hat geschrieben:kann mir jemand vielleicht wenn er genug zeit und lust hat, mir das durchsuchen (rekursiv) erklären?
Ich versuchs. :D
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.

Re: DirectoryEntrySize() rekursiv ?

Verfasst: 16.06.2012 18:50
von Pr0fessor
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......

Re: DirectoryEntrySize() rekursiv ?

Verfasst: 16.06.2012 18:55
von RSBasic
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:
  • C:\
  • C:\abc\
  • C:\def\
  • C:\def\Programme\
  • C:\def\Sonstiges\
  • C:\ghi\
  • C:\jkl\Informationen\
  • C:\mno\
  • Ende

Re: DirectoryEntrySize() rekursiv ?

Verfasst: 16.06.2012 21:13
von captain_hesse
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.

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
viele Grüße
Armin