Deine Stimme gegen Armut - Banner

Knowledge Base » Verzeichnisgröße auslesen

Mit der folgenden Funktion kann man die gesammte Größe eines Verzeichnies inklusive Unterverzeichnisse herausfinden:

Code:  [ Download ] [ Erweitern
function dirsize($dir)
{
    $filename = './cache/dirsize' . str_replace('/', '-', realpath($dir)) . '.txt';
    if (file_exists($filename) && filemtime($filename) >= time() - 86400)
    {
        $size = (int) file_get_contents($filename);
    }
    else
    {
        $dirnames = array($dir);
        $size = 0;

        do {
            $dir = array_shift($dirnames);
            $handle = dir($dir);
            while (false !== ($file = $handle->read()))
            {
                if ($file != '.' && $file != '..')
                {
                    $path = $dir . DIRECTORY_SEPARATOR . $file;
                    (is_dir($path)) ? $dirnames[] = $path : $size += filesize($path);
                }
            }
            $handle->close();
        } while (!empty($dirnames));
        file_put_contents($filename, $size);
    }
    return $size;
}


Erklärungen:

  • $filename = './cache/dirsize' . str_replace('/', '-', realpath($dir)) . '.txt';
    Hiermit wird der Dateiname für die Cache-Datei inklusive des Pfades festgelegt: Mit realpath wird der absolute Pfad für das Verzeichnis ermittelt. Danach werden alle Slashes (/) durch - ersetzt, damit man einen gültigen Dateinamen erhält.

  • if (file_exists($filename) && filemtime($filename) >= time() - 86400)
    Anschließend wird überprüft, ob die Cache-Datei existiert und ob sie neuer als 24 Stunden (86400 Sekunden) ist.

  • $size = (int) file_get_contents($filename);
    Ist die oben genannte Bedingung erfüllt, wird die Cache-Datei ausgelesen.

  • $dirnames = array($dir);
    Die Bedingung wurde nicht erfüllt. Also wird ein neues Array erstellt, welches zunächst das aktuelle Verzeichnis enthält.

  • $size = 0;
    Die Variable $size wird auf Null zurückgesetzt. In ihr wird später die Verzeichnisgröße hochgezählt.

  • do {
    Beginn der Do-While-Schleife.

  • $dir = array_shift($dirnames);
    Hiermit wird das erste Array-Element aus $dirnames ausgelesen und aus dem Array entfernt.

  • (is_dir($path)) ? $dirnames[] = $path : $size += filesize($path);
    Ich habe einige Teile der Funktion übersprungen, da diese bereits woanders ausführlich erklärt wurden: Verzeichnis-Klasse. Mit dem fettgeschrieben Code wird überprüft, ob die in der Variable $path gespeicherte Resource eine Datei oder ein Verzeichnis ist. Ist die Resource ein Verzeichnis wird sie dem Array $dirnames hinzugefügt. Andernfalls wird die Größe der Datei ermittelt und der Variable $size hinzugefügt.

  • } while (!empty($dirnames));
    Die Bedingung für die Do-While-Schleife. Sie wird solange ausgeführt, bis das Array $dirnames leer ist.

  • file_put_contents($filename, $size);
    Zum Schluß wird die ermittelte Größe in die Cache-Datei geschrieben.

Bevor man die Funktion verwenden kann, muss man noch das Verzeichnis "cache" erstellen und die Zugriffsrechte (CHMOD) auf 777 setzten.

Einen kleinen Nachteil gibt es aber bei der Funktion: Die Größe wird in Byte zurückgegeben, wordurch das Ergebnis oftmals schwer zu lesen ist. Deshalb braucht man noch eine zweite Funktion mit der die Größe in die jeweilige Einheit umgewandelt wird:

Code:  [ Download ] [ Erweitern
function convertsize($value)
{
   return ($value >= 1073741824) ? sprintf('%.2f GB', ($value / 1073741824)) : (($value >= 1048576) ? sprintf('%.2f MB', ($value / 1048576)) : sprintf('%.2f KB', ($value / 1024)));
}


Anwendungsbeispiel:

Code:  [ Download ] [ Erweitern
<?php
require('functions_dirsize.php');
$path = './';
echo 'Verzeichnisgröße:' . convertsize(dirsize($path));
?>