Signatur
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
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.';
}
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;
}
// 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.