Geschrieben von heavyraptor am 22.01.2006, 14:38

Hell oh,

Dieses Torturial dient dazu, den Inhalt eines Verzeichnisses schnell und einfach in einer Array zu speichern.
Ausserdem wird die Grösse in byte von allen Dateien und Ordner zusammengezählt, was einen guten Überblick erschafft.
Dazu habe ich vollgende Funktion geschrieben:


function scan_dir($dir,$worm_mode = false) {
if ($dir[strlen($dir) - 1] != "/") {$dir .= "/";}
$result = array(
'directories' => array(),
'files' => array(),
'total_filesize' => 0
);

$dh = opendir($dir);
while (($object = readdir($dh)) !== false) {
if ($object !== "." && $object !== "..") {
if (is_dir("$dir$object")) {
$result['directories'][] = "$dir$object";
$result['total_filesize'] += filesize("$dir$object");
if ($worm_mode == true) {
$drs = scan_dir("$dir$object",true);
$result['directories'] = array_merge($result['directories'],$drs['directories']);
$result['files'] = array_merge($result['files'],$drs['files']);
$result['total_filesize'] += $drs['total_filesize'];
}
}
else if (is_file("$dir$object")) {
$result['files'][] = "$dir$object";
$result['total_filesize'] += filesize("$dir$object");
}
}
}

return $result;
}

Erklärung von scan_dir:
array scan_dir( string directory [, bool worm_mode] )
Über den Parameter directory gibt man an, welches Verzeichniss man durchsuchen soll.
Über den optionalen Parameter worm_mode kann man angeben, ob scan_dir auch alle Verzeichnisse im Verzeichniss directory durchsuchen soll (false für nein, true für ja). Standartwert is false.
scan_dir liefert einen Array mit volgenden Daten zurück.
- directories: einen Array mit den Wegen zu allen gefundenen Verzeichnissen (z.B. ./dir/fotos)
- files: einen Array mit den Wegen zu allen gefundenen Dateien (z.B. ./dir/fotos/bild1.jpg)
- total_filesize: ein Integer-Wert, der die grösse in byte von allen Dateien und Verzeichnissen angibt

Erläuterung des Codes:

function scan_dir($dir,$worm_mode = false) {

Die 1. Zeile sollte klar sein (eine Funktion names scan_dir mit den benötigten Parametern wird erzeugt).


if ($dir[strlen($dir) - 1] != "/") {$dir .= "/";}

Hier wird geprüft, ob das Verzeichniss $dir mit einem Slash (/) endet.
Falls das nicht der Fall ist, wird der Variabel $dir ein Slash angehängt.
Dies ist nötig, weil sonst später im Code Probleme auftreten könnten (mit opendir).


$result = array(
'directories' => array(),
'files' => array(),
'total_filesize' => 0
);

Hier wird ein Array erzeugt, der am schluss dann zurückgeliefert wird (er enthällt das Ergebniss der Funktion).
In diesem Array wird ein Array 'directories', ein Array 'files' und ein Integer 'total_filesize' erzeugt.


$dh = opendir($dir);

Hier wird das Verzeichniss $dir mit opendir geöffnet.


while (($object = readdir($dh)) !== false) {

Mit dieser while-Schleife lesen wir den Inhalt des geöffneten Vereichnisses $dh.
$object ist das aktuelle Element in $dh was mit readdir ausgelesen wird.
Mit !== false wird bei jedem Durchlauf überprüft, ob readdir noch ein Ergebnis zurückliefert, sonst wird die while-Schleife abgebrochen.
Wichtig ist, dass man !== verwendet und nicht !=. Es könnte ja sein, dass eine Datei bzw. ein Verzeichniss 0 heisst.


if ($object !== "." && $object !== "..") {

Hier wird überprüft, ob das evntl. gefundene Verzeichniss nicht gleich . oder .. ist.
Wenn man das nicht machen würde, dann würde man auch das aktualle Verzeichnis . und das vorherige Verzeichnis .. durchsuchen, was 1. nicht geht und 2. keinen Sinn ergibt.


if (is_dir("$dir$object")) {

Hier wird überprüft, ob das gefundene Objekt ein Verzeichniss ist.

Falls das Objekt ein Verzeichniss ist, dann ....

$result['directories'][] = "$dir$object";
$result['total_filesize'] += filesize("$dir$object");

1. Zeile: dem Array $result['directories'] wird ein Element hinzugefügt, das den Weg zum gefundenen Verzeichniss enthällt (z.B. ./dir).
2. Zeile: dem Integer-Wert $result['total_filesize'] wird die Grösse in byte des gefundenen Verzeichnisses hinzuaddiert.
Die Grösse des Verzeichnisses in byte wird über die Funktion filesize ermittelt.


if ($worm_mode == true) {

Jetzt wird überprüft, ob der Parameter worm_mode gleich true ist.

Falls das so ist, dann ...

$drs = scan_dir("$dir$object",true);

... wird ein Variabel $drs definiert, die den Inhalt des gefundenen Verzeichnisses auflistet.
Näturlich werden auch alle Verzeichnisse in diesem Verzeichniss durchsucht usw.


$result['directories'] = array_merge($result['directories'],$drs['directories']);
$result['files'] = array_merge($result['files'],$drs['files']);
$result['total_filesize'] += $drs['total_filesize'];

Jetzt werden die Daten von $drs mit den Daten von $result verbindet und in den entsprechenden Array von $result gespeichert.
Auch die Grösse aller gefundenen Dateien und Verzeichnissen wird addiert und in $result['total_filesize'] gespeichert.


}
}

Hier werden die Badinnungen von is_dir("$dir$object") und $worm_mode == true geschlossen.
Kennt wohl jeder ;).


else if (is_file("$dir$object")) {

Dieser Code wird logischerweise nur aufgerufen, falls das Objekt kein Verzeichniss ist.
Also wird hier geprüft, ob das Objekt eine Datei ist.

Falls das Objekt eine Datei ist, dann ....

$result['files'][] = "$dir$object";
$result['total_filesize'] += filesize("$dir$object");

... passiert eigentlich das gleiche wie bei einem Verzeichniss.
Dem Array $result['files'] wird ein Element mit dem Weg zur Datei hinzugefügt, und die Grösse der Datei in byte wird zum Integer-Wert $result['total_filesize'] hinzuaddiert.


}
}
}

Hier kommt der aller komplizierteste Teil im Code ;):
Die 3 offenen Bedinnungen werden geschlossen (is_file("$dir$object"), ($object !== "." && $object !== "..") und die while-Schleife).

return $result;
}

Hier in den letzten 3 Zeilen des Codes, wird der Array $result zurückgeliefert und zuletzt wird die Funktion geschlossen.

Anwendungsbeispiel:

$scanner = scan_dir(".");
print_r($scanner);
/*
Beispielausgabe:
Array
(
[directories] => Array
(
[0] => ./fotos
[1] => ./testDir
)
[files] => Array
(
[0] => ./index.php
[1] => ./testFile.php
[2] => ./foo.php
)
[total_filesize] => 215634
*/

$scanner = scan_dir(".",true);
print_r($scanner);
/*
Beispielausgabe:
Array
(
[directories] => Array
(
[0] => ./fotos
[1] => ./testDir
[3] => ./fotos/foo
)
[files] => Array
(
[0] => ./index.php
[1] => ./testFile.php
[2] => ./foo.php
[3] => ./fotos/bild1.jpg
[4] => ./fotos/bild2.jpg
[5] => ./fotos/bild3.jpg
)
[total_filesize] => 3215634
*/

$scanner = scan_dir("dir/fotos/");
print_r($scanner);
/*
Beispielausgabe:
Array
(
[directories] => Array
(
[0] => ./fotos/foo
)
[files] => Array
(
[3] => ./fotos/bild1.jpg
[4] => ./fotos/bild2.jpg
[5] => ./fotos/bild3.jpg
)
[total_filesize] => 3215634
*/

Ich hoffe es ist alles klar und deutlich.
Bei Fragen PN an mich.

mfg,
hr

Bewertung Anzahl
6
70,0 %
7 Bewertungen
5
30,0 %
3 Bewertungen