DirectoryEntrySize() rekursiv ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
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 ?

Beitrag 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"?
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: DirectoryEntrySize() rekursiv ?

Beitrag 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"
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: DirectoryEntrySize() rekursiv ?

Beitrag 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
"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
Benutzeravatar
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 ?

Beitrag 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?
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: DirectoryEntrySize() rekursiv ?

Beitrag 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
[...]
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
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 ?

Beitrag 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?
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: DirectoryEntrySize() rekursiv ?

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
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 ?

Beitrag 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......
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: DirectoryEntrySize() rekursiv ?

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
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 ?

Beitrag 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
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Antworten