Ordnergrösse ermitteln - Procedure-Rekursiv Prob. [Gelöst]

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Ordnergrösse ermitteln - Procedure-Rekursiv Prob. [Gelöst]

Beitrag von TheCube »

Hallo,
ich habe hier aus dem Forum zwei entsprechende Procedures um die Ordnergrösse
inklusive aller Unterordner zu ermitteln. Eine Version(2) funktioniert prima, die
andere (1) gibt nur die Grösse der Files des Toplevels zurück, aber verschluckt
die Grössen der Unterordner.

Auch nach Stunden find ich nicht den kleinen feinen Unterschied warum Version1 nicht will ... :bluescreen:

Code: Alles auswählen

; Version 1 gibt zuwenig (nur Toplevel?) zurück !

EnableExplicit

Procedure.q GetDirectorySize(path.s, size.q=0) ; Version 1: Hier wird die bisher gefundene Größe für rekursiven Aufruf wieder übergeben
  Protected dir.l=ExamineDirectory(#PB_Any, path, "") 

  If dir 
    While NextDirectoryEntry(dir) 
      If DirectoryEntryType(dir) = #PB_DirectoryEntry_File 
        size+DirectoryEntrySize(dir) : Debug size
      Else
        If DirectoryEntryName(dir) <> "." And DirectoryEntryName(dir) <> ".." 
          Debug path+DirectoryEntryName(dir)+"\"
          Debug size
          GetDirectorySize(path+DirectoryEntryName(dir)+"\", size) ; REKURSIV
        EndIf
      EndIf 
    Wend 
    FinishDirectory(dir) 
  EndIf 
  ProcedureReturn size 
EndProcedure 

; --------------------------------------------------------------------------------

Procedure.i DirectorySize(Path.s)  ; Version 2: Funktioniert
  
  Protected Directory.i 
  Protected Size.i 

  If Right(Path, 1) <> "\" : Path + "\" : EndIf ; Pfad muss immer mit "\" enden
  Directory = ExamineDirectory(#PB_Any, Path, "")
  If Directory
    While NextDirectoryEntry(Directory)
      Select DirectoryEntryType(Directory)
        Case #PB_DirectoryEntry_File
          Size + DirectoryEntrySize(Directory) ; Dateigröße hinzu addieren
        Case #PB_DirectoryEntry_Directory
          If DirectoryEntryName(Directory) <> "." And DirectoryEntryName(Directory) <> ".."
            Size + DirectorySize(Path+DirectoryEntryName(Directory)) ; Größe des Unterordners hinzu addieren REKURSIV
          EndIf
      EndSelect
    Wend
    FinishDirectory(Directory)
  EndIf
  
  ProcedureReturn Size
  
EndProcedure

; --------------------------------------------------------------------------------
Define.s SPath = PathRequester("Bitte Verzeichnis wählen:", "")
If SPath = "" : End : EndIf
Debug SPath+" : "+StrF(GetDirectorySize(SPath)/1024/1024,2)+" MB"  ; Version 1
Debug SPath+" : "+StrF(DirectorySize(SPath)/1024/1024,2)+" MB"     ; Version 2
Zuletzt geändert von TheCube am 30.03.2015 00:45, insgesamt 1-mal geändert.
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Ordnergrösse ermitteln - Procedure-Rekursiv-Problem ?

Beitrag von NicknameFJ »

Hallo TheCube,

Code: Alles auswählen

        size = GetDirectorySize(path+DirectoryEntryName(dir)+"\", size) ; REKURSIV
sollte das Problem lösen.

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Ordnergrösse ermitteln - Procedure-Rekursiv-Problem ?

Beitrag von TheCube »

Ja, das war der Fehler, danke schön.

... an manchen Tagen sollte man besser im Bett bleiben. :D
Antworten