W3docs

readdir()

Die PHP-Funktion readdir() liest Verzeichniseinträge einzeln aus einem mit opendir() geöffneten Handle.

Die PHP-Funktion readdir() liest einen Eintrag nach dem anderen aus einem Verzeichnis, das Sie zuvor mit opendir() geöffnet haben. Jeder Aufruf gibt den Namen der nächsten Datei oder des nächsten Unterverzeichnisses zurück und bewegt einen internen Zeiger weiter, sodass Sie durch den Aufruf in einer Schleife alle Einträge eines Ordners durchlaufen können. Diese Seite erklärt die Syntax, den Rückgabewert, das Schleifenmuster zur Vermeidung eines häufigen Fehlers und den Vergleich von readdir() mit höherstufigen Alternativen.

Syntax

readdir(resource $dir_handle = null): string|false
  • $dir_handle — ein Verzeichnis-Handle, das von opendir() zurückgegeben wird. Wenn Sie es weglassen, verwendet PHP das zuletzt von opendir() geöffnete Handle.
  • Rückgabewert — der Dateiname des nächsten Eintrags als string oder false, wenn keine weiteren Einträge vorhanden sind. Die Einträge enthalten die speziellen Namen . (aktuelles Verzeichnis) und .. (übergeordnetes Verzeichnis) und werden in der Reihenfolge zurückgegeben, in der das Dateisystem sie speichert — nicht sortiert.

Ein Verzeichnis lesen

Um readdir() zu verwenden, öffnen Sie zunächst ein Verzeichnis-Handle mit opendir(), durchlaufen Sie es mit readdir() in einer Schleife, bis es false zurückgibt, und geben Sie das Handle anschließend mit closedir() frei:

<?php

$dir = __DIR__; // the directory this script lives in

if ($handle = opendir($dir)) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry !== "." && $entry !== "..") {
            echo "$entry\n";
        }
    }
    closedir($handle);
}

Dies öffnet das Verzeichnis, durchläuft dessen Inhalt und gibt jeden Namen außer . und .. aus. Der Aufruf von closedir() gibt das Handle frei, wenn Sie fertig sind.

Warum false !== und kein einfacher Wahrheitswert-Check

Der strikte Vergleich false !== ($entry = readdir($handle)) ist wesentlich, nicht nur stilistisch. Ein Verzeichnis kann legitim einen Eintrag namens "0" enthalten, und eine Überprüfung auf leere Zeichenketten würde ebenfalls fehlschlagen. PHP behandelt den string "0" als falsy, sodass while ($entry = readdir($handle)) die Schleife vorzeitig beenden würde, sobald eine solche Datei gefunden wird. Der strikte Vergleich mit false lässt die Schleife erst dann enden, wenn readdir() tatsächlich keine Einträge mehr zurückgeben kann.

Einträge nach Erweiterung filtern

readdir() gibt rohe Namen zurück, daher liegt jegliches Filtern bei Ihnen. Kombinieren Sie es mit pathinfo(), um nur die gewünschten Dateitypen zu behalten — hier Bilder:

<?php

$dir = __DIR__;
$allowed = ['jpg', 'jpeg', 'png', 'gif'];

if ($handle = opendir($dir)) {
    while (false !== ($entry = readdir($handle))) {
        $extension = strtolower(pathinfo($entry, PATHINFO_EXTENSION));
        if ($entry !== "." && $entry !== ".." && in_array($extension, $allowed, true)) {
            echo "$entry\n";
        }
    }
    closedir($handle);
}

pathinfo($entry, PATHINFO_EXTENSION) extrahiert die Erweiterung jedes Namens, und in_array(..., true) (strikter Modus) prüft sie gegen die Erlaubnisliste, sodass nur übereinstimmende Dateien ausgegeben werden.

Dasselbe Verzeichnis erneut lesen

Da jeder readdir()-Aufruf den internen Zeiger weiterbewegt, gibt eine zweite Schleife über dasselbe Handle nichts zurück — der Zeiger befindet sich bereits am Ende. Verwenden Sie rewinddir(), um ihn zum ersten Eintrag zurückzusetzen, ohne das Verzeichnis erneut zu öffnen:

<?php

$handle = opendir(__DIR__);

while (false !== ($entry = readdir($handle))) { /* first pass */ }

rewinddir($handle); // back to the start

while (false !== ($entry = readdir($handle))) {
    // second pass sees every entry again
}

closedir($handle);

readdir() vs scandir() vs glob()

readdir() ist der einfache Baustein auf unterster Ebene. In modernem Code greift man meist auf eine Einzeilen-Alternative zurück:

  • scandir() gibt alle Einträge als sortiertes array in einem einzigen Aufruf zurück — ohne das Verwalten von opendir/closedir.
  • glob() passt zu einem Shell-artigen Muster (z. B. *.png) und gibt vollständige Pfade zurück, was das Filtern nach Erweiterungen zum Einzeiler macht.

Verwenden Sie readdir(), wenn Sie Einträge einzeln verarbeiten möchten, ohne die gesamte Liste in den Speicher zu laden (nützlich bei sehr großen Verzeichnissen), oder wenn Sie eine feinkörnige Kontrolle über die Iteration benötigen.

Häufige Fallstricke

  • Immer . und .. überspringenreaddir() liefert sie mit, und das Vergessen, sie herauszufiltern, ist der häufigste Fehler, besonders bei rekursiven Verzeichnisdurchläufen.
  • opendir() kann fehlschlagen. Wenn der Pfad nicht existiert oder nicht lesbar ist, gibt es false zurück und gibt eine Warnung aus, weshalb die Beispiele die Schleife mit if ($handle = opendir($dir)) absichern.
  • Schließen Sie Ihre Handles. Rufen Sie closedir() auf (oder lassen Sie das Skript enden), um die Ressource freizugeben.
  • Die Reihenfolge ist nicht garantiert. Wenn Sie eine sortierte Ausgabe benötigen, verwenden Sie scandir() oder sortieren Sie die Namen selbst.

Übungen

Übung
Was ist die Funktion von readdir() in PHP?
Was ist die Funktion von readdir() in PHP?
Was this page helpful?