Problematik
Manchmal ist es nützlich, die reale Byte-Größe aller Inhalte, die sich unterhalb eines Verzeichnisses befinden, zu kennen. Nun gibt es die PHP-Standardfunktion filesize(), welche die Byte-Größe einer Datei ermittelt. Doch die reale Größe eines Verzeichnisses besteht nicht nur in der Summe der Größen aller darin befindlichen Dateien, sondern auch in der Summe aller Dateien, die sich in Unter- und Unterunterverzeichnissen befinden. Eine eigene, rekursiv arbeitende Funktion kann diese Aufgabe erfüllen.
Code
function dirsize($dir) { if (!is_dir($dir)) return FALSE; $size = 0; $dh = opendir($dir); while(($entry = readdir($dh)) !== false) { if($entry == "." || $entry == "..") continue; if(is_dir( $dir . "/" . $entry)) $size += dirsize($dir . "/" . $entry); else $size += filesize($dir . "/" . $entry); } closedir($dh); return $size; }
Erläuterung
Die Funktion dirsize() erwartet eine Verzeichnisangabe als Parameter. Es kann sich um einen absoluten Pfad handeln wie etwa "/usr/home/www/htdocs", oder um einen relativen Pfad wie "../". In letzterem Fall ist der aktuelle Arbeitspfad des ausführenden Scripts der Bezugspunkt.
Die Funktion überprüft zunächst mit is_dir(), ob der übergebene Pfad ein Verzeichnis ist. Wenn nicht, wird FALSE zurückgegeben. Anschließend wird die Byte-Summen-Variable $size mit 0 initialisiert. Daran anschließend wird das übergebene Verzeichnis mit opendir() geöffnet. In einer zum Einlesen von Verzeichnisinhalten typischen while-Schleife wird jeder Verzeichniseintrag mit readdir() abgearbeitet.
Und nun wird es interessant: ist der aktuell bearbeitete Verzeichniseintrag selbst wieder ein Verzeichnis (if(is_dir( $dir . "/" . $entry))), wird $size um den Rückgabewert des Funktionsaufrufs von dirsize() erhöht. Die Funktion ruft sich also selber auf und speichert ihren eigenen Rückgabewert in einer funktionsinternen Variablen. Die Stack-Verarbeitung von PHP ist so ausgelegt, dass ein solches Konstrukt funktioniert. Jeder neue Funktionsaufruf von dirsize() kapselt seine Variable $size.
Ist der Verzeichniseintrag kein Verzeichnis, sondern eine Datei, wird $size einfach um den Rückgabewert von filesize() erhöht.
Am Ende wird das Verzeichnis-Handle freigegeben, und der in $size ermittelte Gesamtumfang wird zurückgegeben.
Tipp
Mit formatFileSize() können Sie den Rückgabewert von dirsize() lesbarer gestalten.
