Start · Sprachen · PHP · Referenz · FilesystemIterator

FilesystemIterator

Klasse

Iteriert über den Inhalt eines Verzeichnisses und liefert dabei <code>SplFileInfo</code>-Objekte oder Dateinamen als Strings.

seit PHP 5.3.0 Kategorie: oop

Signatur

class FilesystemIterator extends DirectoryIterator implements SeekableIterator

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

Typ

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;
}
bild.jpg (Datei) dokumente (Verzeichnis) logo.png (Datei)

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;
    }
}
JSON-Konfiguration gefunden: /var/www/config/database.json JSON-Konfiguration gefunden: /var/www/config/app.json

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()
    );
}
bild.jpg 204800 Bytes logo.png 51200 Bytes

// Wichtig · Fallstricke

Flags-Übersicht (wichtigste Konstanten):

  • FilesystemIterator::CURRENT_AS_FILEINFO – Aktueller Wert ist ein SplFileInfo-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ür RecursiveDirectoryIterator).

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.