Signatur
Beschreibung
FilesystemIterator ist eine verbesserte Variante von DirectoryIterator. Er überspringt standardmäßig die Einträge . und .. und bietet über Flags eine feingranulare Kontrolle darüber, in welcher Form jeder Verzeichniseintrag zurückgegeben wird – als SplFileInfo-Objekt, als Pfadstring oder als Dateiname.
Über den Konstruktor oder die Methode setFlags() kann das Verhalten des Iterators angepasst werden. So lässt sich z. B. mit FilesystemIterator::KEY_AS_FILENAME der Schlüssel auf den reinen Dateinamen setzen oder mit FilesystemIterator::CURRENT_AS_PATHNAME der aktuelle Wert als vollständiger Pfad-String liefern.
FilesystemIterator eignet sich hervorragend als Basis für komplexere Iteratoren wie RecursiveDirectoryIterator oder in Kombination mit IteratorIterator und FilterIterator. Er wird typischerweise in der Dateiverarbeitung, beim Lesen von Upload-Verzeichnissen oder beim Durchsuchen von Konfigurationsordnern eingesetzt.
Im Gegensatz zu DirectoryIterator ist FilesystemIterator rewindbar und kann ohne Probleme mehrfach durchlaufen werden, sofern das zugrundeliegende Dateisystem es erlaubt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $directory Pflicht | string | Pfad zum Verzeichnis, das iteriert werden soll. Wird ein ungültiger Pfad übergeben, wirft der Konstruktor eine UnexpectedValueException. |
|
| $flags | int | FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS | Kombination aus FilesystemIterator-Klassenkonstanten, die steuern, wie Schlüssel und aktueller Wert geliefert werden und ob Punkte-Einträge übersprungen werden. |
Rückgabewert
Beispiele
Einfaches Auflisten eines Verzeichnisses
<?php
$iterator = new FilesystemIterator('/var/www/uploads');
foreach ($iterator as $entry) {
// $entry ist ein SplFileInfo-Objekt
echo $entry->getFilename()
. ' (' . ($entry->isDir() ? 'Verzeichnis' : 'Datei') . ')'
. PHP_EOL;
}
Nur Dateien mit bestimmter Endung filtern
<?php
$iterator = new FilesystemIterator(
'/var/www/config',
FilesystemIterator::SKIP_DOTS | FilesystemIterator::CURRENT_AS_PATHNAME
);
foreach ($iterator as $path) {
// $path ist hier ein vollständiger Pfad-String
if (str_ends_with($path, '.json')) {
echo 'JSON-Konfiguration gefunden: ' . $path . PHP_EOL;
}
}
Verwendung mit Schlüssel als Dateiname
<?php
$flags = FilesystemIterator::KEY_AS_FILENAME
| FilesystemIterator::CURRENT_AS_FILEINFO
| FilesystemIterator::SKIP_DOTS;
$iterator = new FilesystemIterator('/var/www/uploads', $flags);
foreach ($iterator as $filename => $fileinfo) {
printf(
"%-30s %10d Bytes\n",
$filename,
$fileinfo->getSize()
);
}
// Wichtig · Fallstricke
Flags-Übersicht (wichtigste Konstanten):
FilesystemIterator::CURRENT_AS_FILEINFO– Aktueller Wert ist einSplFileInfo-Objekt (Standard).FilesystemIterator::CURRENT_AS_PATHNAME– Aktueller Wert ist ein vollständiger Pfad als String.FilesystemIterator::CURRENT_AS_SELF– Aktueller Wert ist das Iterator-Objekt selbst.FilesystemIterator::KEY_AS_PATHNAME– Schlüssel ist der vollständige Pfad (Standard).FilesystemIterator::KEY_AS_FILENAME– Schlüssel ist nur der Dateiname.FilesystemIterator::SKIP_DOTS– Überspringt.und..(Standard).FilesystemIterator::FOLLOW_SYMLINKS– Symbolischen Links wird gefolgt (relevant fürRecursiveDirectoryIterator).
Achtung: Wird ein nicht vorhandenes oder nicht lesbares Verzeichnis übergeben, wirft der Konstruktor eine UnexpectedValueException. Es empfiehlt sich, den Aufruf in einem try/catch-Block abzusichern.
Bei sehr großen Verzeichnissen mit tausenden Einträgen kann das Iterieren ressourcenintensiv sein. Für rekursive Verzeichnisdurchläufe sollte RecursiveDirectoryIterator in Kombination mit RecursiveIteratorIterator bevorzugt werden.