Mit SPL ein Verzeichniss auflisten
Geschrieben von Dejan Spasic • Thursday, 9. August 2007 • Kategorie: PHP • Kommentare (0)
Viele setzen noch die alte Methode ein um ein Verzeichniss aufzulisten. Bei einer flache Auflistung das sich nur auf das aktuelle Verzeichniss beschränkt, ist das auch kein Problem. Muss jedoch das Verzeichniss rekursiv aufgelistet werden, sieht das Ganze etwas anders aus. Schnell wird eine Funktion für rekursive Zwecke erstellt, die den Inhalt eines Ordners auflistet und bei einem weiterem Ordner sich nochmal selbst aufruft. Dabei geht es dank Standard PHP Library (SPL) viel einfacher.
Der DirectoryIterator
Beginnen wir mit dem DirectoryIterator. DirectoryIterator bietet uns die Möglichkeit den Inhalt eines Verzeichnisses auf einfache Art und Weise aufzulisten. Wie der Name schon vermuten lässt, implementiert DierectoryIterator das Iterator Interface und ist eine Unterklasse von SplFileInfo. Über das Iterator Interface erfährt man unter "Standard PHP Library (SPL) das Iterator Interface" mehr. Nun gut, das Auflisten des Ihnalts eines Verzeichnisses mittels DierectoryIterator sieht wie folgt aus.
try {
foreach (new DirectoryIterator(dirname(_FILE_)) as $file) {
printf('Mein Name ist: %s%s', $file, PHP_EOL);
printf('Ich bin vom Typ: %s ', $file->getType());
printf('und %d bytes groß.%s', $file->getSize(), PHP_EOL);
printf('Mein zu Hause ist %s.%s', $file->getPath(), PHP_EOL);
printf('Meine genaue Adresse lautet: %s.%s',
$file->getPathname(), PHP_EOL);
printf('Man hat zuletzt am %s auf mich zugegriffen. %s',
date('d.m.Y h:i:s', $file->getCTime()), PHP_EOL);
printf('Ich bin lesbar? %s%s',
$file->isReadable() ? 'ja' : 'nein', PHP_EOL);
printf('Ich bin beschreibar? %s%s',
$file->isWritable() ? 'ja' : 'nein', PHP_EOL);
print PHP_EOL . str_repeat('#', 50) . str_repeat(PHP_EOL, 2);
}
} catch (Exception $e) {
die($e);
}
Was es mit diesen try .. catch zu tun hat, ist unter der folgende URL genauer beschrieben. Fehlerbehandlung mit Ausnahmen.
Wie man unschwer erkennen kann, wird nur eine Instanz vom DirectoryIterator erstellt und man kann den Inhalt sofort mit foreach auflisten. Dabei ist $file immer eine Instanz von SplFileInfo. Eigentlich ziemlich simpel, nicht wahr.
Der RecursiveDirectoryIterator
RecursiveDirectoryIterator besitzt genau die selben Methoden wie DirectoryIterator. Es besitzt aber, da es das RecursivIterator Interface implementiert, noch zwei weitere Methoden. Diese sind für die rekursiven Iterationen behilflich.
- hasChildren() gibt an ob das Element weitere Kinderelemente besitzt.
- getChildren() liefert die Kinderelemente des aktuellen Elements zurück.
Hier ein Beispiel wie man die Klasse RecursiveDirectoryIterator anwenden kann.
function displayFiles(RecursiveDirectoryIterator $rdi, $depth = 0)
{
foreach ($rdi as $file) {
printf('%s%s type = %s %s', str_repeat(' ', $depth),
$file, $file->getType(), PHP_EOL);
if ($file->hasChildren()) {
displayFiles($file->getChildren(), ++$depth);
}
}
}
try {
displayFiles(new RecursiveDirectoryIterator(dirname(_FILE_)));
} catch (Exception $e) {
die($e);
}
Im obigen Beispiel wird mittels einer Helfer-Funktion und der RecursiveDirectoryIterator Klasse ein Verzeichniss rekursiv aufgelistet. Das sieht schon relativ schick aus, aber es geht noch besser.
Der RecursiveIteratorIterator
Die Klasse RecursiveIteratorIterator bietet, wie der Name schon sagt, die Möglichkeit rekursiv durch die Elemente einer Menge zu durchlaufen. Als ersten Parameter erwartet es ein Klasse die das RecursivIterator Interface implementiert hat. Der zweite Parameter bestimmt in welcher Reihenfolge durch die Menge iteriert werden soll. Der dritte Paramter gibt an, ob die Klasse bei einen misslungenden Versuch die Kinderlemente zurück zu geben die Ausnahme ignorieren, oder werfen soll. Voreingestellt wird eine Ausnahme geworfen.
try {
$dir = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(dirname(_FILE_)),
RecursiveIteratorIterator::SELF_FIRST);
foreach ($dir as $file) {
printf('%s%s%s', str_repeat(' ', $dir->getDepth()),
$file, PHP_EOL);
}
} catch (Exception $e) {
die($e);
} Einfacher geht es doch wirklich nicht ![]()
Das wars auch schon. Viel Spaß mit PHP 5 und SPL.


0 Kommentare
Kommentar schreiben