Systemvoraussetzung
- Linux
- Windows
- PHP 3
- PHP 4
- PHP 5
Datei(en)
directory_size.php
Problem
Sie möchten gerne wissen, wie viel Speicher Ihre Dateien in einem bestimmten
Verzeichnis oder in allen Verzeichnissen verbrauchen? Das nachfolgende
Beispiel erledigt diese Aufgabe. Sie können dabei nur ein Verzeichnis oder
auch seine Unterverzeichnisse durchsuchen lassen.
Lösung
Im folgenden Beispiel werden wir ein Programm vorstellen, das entweder den
Speicherverbrauch für ein einzelnes Verzeichnis auflistet oder rekursiv auch
für die in dem angegebenen Verzeichnis befindlichen Unterverzeichnisse. Je
nachdem, wie groß das Datenaufkommen ist, wird der Wert in Kilobyte oder
Megabyte ausgegeben.
function dir_size($dir, &$size, $recursive=TRUE)
@param string $dir
@param integer &$size
@param bool $recursive
@return bool
Die Funktion dir_size() erwartet als Parameter das Verzeichnis ($dir z.
B. „Bilder/“) von dem aus die Speichergröße ermittelt werden soll, die Variable
$size als Referenz für die Speicherung der Gesamtgröße in Byte und
$recursive (FALSE – durchsucht nur das angegebene Verzeichnis; TRUE durchsucht
auch alle Unterverzeichnisse).
Nach Aufruf von scan_dir() durchläuft die Funktion das aktuelle Verzeichnis
(37). Jedes Verzeichnis beginnt mit einem . (Punkt) und einem .. (Punkt Punkt),
die auch als „Dateien“ eingelesen werden.
Sollte unsere Funktion diese beide Pseudodateien finden (43), so bricht sie den
aktuellen Schleifendurchlauf (42) ab und fährt mit der nächsten Datei oder
dem nächsten Verzeichnis fort.
Sollten Sie bei der Parameterangabe der Funktion (35) $recursive=FALSE
gesetzt haben, werden keine Unterverzeichnisse ausgelesen. Die Überprüfung
(47) hierfür findet dann ebenfalls in dem Schleifendurchlauf statt. Findet die
Funktion im aktuellen Verzeichnis ein weiteres Unterverzeichnis (52), ruft sie
sich mit dem Pfad zum Unterverzeichnis als Parameter erneut auf (35) und
durchläuft dann das Unterverzeichnis.
Findet die Funktion eine Datei (54), so addiert (55) sie die Dateigröße zu
unserem bisher ermittelten Wert (in Byte). Da wir die Variable $size als
Referenz übergeben haben, müssen wir diese nicht explizit zurückgeben, da
Sie außerhalb dieser Funktion bereits bekannt ist und den Wert vorliegen hat.
035: 036: 037: 038: 039: 040: 041: 042: 043: 044: 045: 046: 047: 048: 049: 050: 051: 052: 053: 054: 055: 056: 057: 058: 059: 060: 061: |
function dir_size($dir, &$size, $recursive=TRUE)
{
$handle = @opendir($dir); if(!$handle) return false; while ($file = @readdir ($handle)) {
if (eregi("^\.{1,2}$",$file)) {
continue; }
if(!$recursive && $dir != $dir.$file."/") {
if(is_dir($dir.$file)) continue; } if(is_dir($dir.$file)) {
dir_size($dir.$file."/", $size, $recursive);
} else {
$size += filesize($dir.$file); } }
@closedir($handle);
}
|
Beispiel 7.7: directory_size.php
function sizeMath($size)
@param integer $size
@return integer $size
Die Funktion sizeMath() erwartet als Parameter die Größe aller Dateien in
Bytes. Wir rechnen in dieser Funktion lediglich die Werte für eine ansprechende
Darstellung um. Bei dem übermittelten Wert handelt es sich um Byte, die wir
entweder in Kilobyte oder Megabyte umrechnen wollen.
Sollte der Wert größer oder gleich 1 Million sein (73), handelt es sich bei der
Ausgabe um Megabyte und wir formatieren die Ausgabe so, dass nur noch
zwei Stellen hinter dem Komma angezeigt werden (75). War der Wert kleiner
(76), formatieren wir ihn nach Kilobyte (78).
Zum Schluss müssen wir nur noch den formatierten Wert an die aufrufende
Stelle zurückgeben (81).
071: 072: 073: 074: 075: 076: 077: 078: 079: 080: 081: 082: 083: |
function sizeMath($size)
{
if($size >= 1000000) {
$size = $size / 1000000; $size = sprintf("%01.2f", $size) . ' MegaByte';
} else {
$size = $size / 1000; $size = sprintf("%01.1f", $size) . ' KiloByte'; } return $size; }
|
Beispiel 7.8: directory_size.php
Der restliche Programmcode ist wieder sehr schnell erklärt. Wir setzen zuerst
die Variable $size (85) auf den Wert 0 (Null), die wir innerhalb der Funktion als
Referenz übergeben. Wir rufen im nächsten Schritt die Funktion dir_size()
(87) für die Berechnung der Speichergröße auf und übergeben ihr das zu durchsuchende
Verzeichnis, $size für die Speichergröße und den booleschen Wert
„TRUE“ oder „FALSE“. Geben Sie „TRUE“ an, werden auch alle Unterverzeichnisse
mit durchsucht, ansonsten nur das aktuelle Verzeichnis.
Wir erhalten von dieser Funktion keinen Rückgabewert, da wir ja die Variable
$size als Referenz übergeben haben und somit der Wert außerhalb der
Funktion bereits mit der Größe vorliegt.
Wir müssen lediglich die Größe formatieren. Dafür geben wir den Wert in Byte
an die Funktion sizeMath() (89) und erhalten als Rückgabewert entweder
einen formatierten Wert in Kilobyte oder Megabyte.
085: 086: 087: 088: 089: 090: 091:
| $size = 0;
dir_size("bilder/", $size, TRUE);
$sizeD = sizeMath($size);
echo $sizeD; |
Beispiel 7.9: directory_size.php
Ausgabe im Browser
Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!
Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.
|