Start · Sprachen · PHP · Referenz · readdir

readdir

Funktion

Liest den nächsten Eintrag (Datei- oder Verzeichnisnamen) aus einem mit <code>opendir()</code> geöffneten Verzeichnis-Handle.

seit PHP 4.0.0 Kategorie: io

Signatur

readdir(resource $dir_handle = ?): string|false

Beschreibung

readdir() gibt bei jedem Aufruf den Namen des nächsten Eintrags im geöffneten Verzeichnis zurück. Die Einträge werden in der Reihenfolge zurückgegeben, in der das Dateisystem sie speichert – diese Reihenfolge ist nicht zwingend alphabetisch. Ist das Ende des Verzeichnisses erreicht oder tritt ein Fehler auf, gibt die Funktion false zurück.

Wichtig: readdir() liefert immer auch die Sondereinträge . (aktuelles Verzeichnis) und .. (übergeordnetes Verzeichnis). Diese müssen in der Regel explizit herausgefiltert werden, bevor die Einträge weiterverarbeitet werden.

Typischer Einsatz ist das manuelle Durchlaufen eines Verzeichnisses in einer while-Schleife. Für einfachere Anwendungsfälle sind scandir() oder Iteratoren wie DirectoryIterator oft komfortabler, da sie keine Ressource-Verwaltung erfordern.

Der optionale Parameter $dir_handle kann weggelassen werden, wenn zuvor opendir() ohne Rückgabe-Zuweisung aufgerufen wurde (interne Ressource). In der Praxis sollte jedoch immer explizit eine Ressource übergeben werden.

Parameter

Name Typ Default Beschreibung
$dir_handle resource Ein mit opendir() geöffnetes Verzeichnis-Handle. Wird der Parameter weggelassen, verwendet PHP die zuletzt intern geöffnete Verzeichnis-Ressource.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den Namen des nächsten Verzeichniseintrags als string zurück. Wurden alle Einträge gelesen oder tritt ein Fehler auf, wird false zurückgegeben.

Beispiele

Alle Einträge eines Verzeichnisses auflisten (ohne . und ..)

<?php
$pfad = '/var/www/html/uploads';

if ($handle = opendir($pfad)) {
    while (($eintrag = readdir($handle)) !== false) {
        // Sondereinträge herausfiltern
        if ($eintrag === '.' || $eintrag === '..') {
            continue;
        }
        echo $eintrag . PHP_EOL;
    }
    closedir($handle);
} else {
    echo 'Verzeichnis konnte nicht geöffnet werden.';
}
bild.jpg dokument.pdf archiv.zip

Nur Dateien (keine Unterverzeichnisse) sammeln

<?php
$pfad = '/var/www/html/uploads';
$dateien = [];

if ($handle = opendir($pfad)) {
    while (($eintrag = readdir($handle)) !== false) {
        $vollPfad = $pfad . DIRECTORY_SEPARATOR . $eintrag;
        if (is_file($vollPfad)) {
            $dateien[] = $eintrag;
        }
    }
    closedir($handle);
}

sort($dateien);
foreach ($dateien as $datei) {
    echo $datei . PHP_EOL;
}
archiv.zip bild.jpg dokument.pdf

// Wichtig · Fallstricke

Achtung beim Vergleich: Der Rückgabewert muss mit !== false (strikter Vergleich) geprüft werden. Ein einfaches != false oder while ($eintrag = readdir(...)) würde fehlschlagen, wenn ein Verzeichniseintrag den Namen "0" trägt, da dieser als falsy gewertet wird.

Sicherheitshinweis: Werden Dateinamen direkt aus readdir() in HTML ausgegeben, unbedingt htmlspecialchars() verwenden, um XSS zu verhindern. Werden sie in Pfadoperationen verwendet, mit basename() und Pfadvalidierung absichern, um Path-Traversal-Angriffe zu vermeiden.

Für einfachere oder objektorientierte Anwendungsfälle empfiehlt sich scandir() (liefert ein Array) oder der DirectoryIterator aus der SPL.