Hey Thorsten, deine Funktion arbeitet irgendwie falsch?
Ich habe auch eine gebastelt, die scheint geringfügig schneller zu arbeiten, als deine (ca. 30 ms):
Code: Alles auswählen
Procedure .q GetDirectorySize(path.s, recursive=#True)
PathAddBackslash_(@path)
Protected dir.l=ExamineDirectory(#PB_Any, path, ""), size.q
If dir
While NextDirectoryEntry(dir)
If DirectoryEntryType(dir) = #PB_DirectoryEntry_File
size+DirectoryEntrySize(dir)
Continue
ElseIf recursive And DirectoryEntryName(dir) <> "." And DirectoryEntryName(dir) <> ".."
size+GetDirectorySize(path+DirectoryEntryName(dir)+"\", 1)
EndIf
Wend
FinishDirectory(dir)
ProcedureReturn size
EndIf
EndProcedure
Debug GetDirectorySize("C:\")
Nun zu deinem Fehler: Mein Laufwerk C: ist mit 30,0 GB belegt, deine Procedure gibt jedoch 1,0 GB zurück? Meine hingegen, gibt 'korrekte' 0.03 TB zurück (ich habe das mit dem byterechner() umgerechnet).
Nochwas: Du speerst auch alle Dateien aus, die "." oder ".." heißen, ist das denn so gewollt? Bei Verzeichnissen verstehe ich das ja, aber Dateien? Und warum, übergibst du der Procedure beim rekursiven AUfurf die Variable "Rekursiv"? DIe muss dann ja erst wieder ausgelesen werden; machs doch so wie ich und gib direkt 1 an die Prozedur, denn ob Rekursivität gewünscht ist, prüfst du ja eh vorher.
Außerdem würde ich an deiner Stelle
nicht oder nur mit einer umgestellten If-Abfrage den DirectoryEntryName() zwischenspeichern, weil es doch auf jeder Festplatte eh mehr Dateien als Verzeichnisse gibt, sodass sich dieser vermeintliche Geschwindigkeitsvorteil nicht auszahlt, auch wnen es eine hübsche Idee ist!