Signatur
Beschreibung
opendir() öffnet das angegebene Verzeichnis und gibt ein Verzeichnis-Handle zurück, das anschließend mit readdir(), rewinddir() und closedir() weiterverarbeitet werden kann. Es ist die klassische Low-Level-Methode, um Verzeichnisinhalte Datei für Datei zu lesen.
Die Funktion ist besonders nützlich, wenn ein Verzeichnis sehr viele Einträge enthält und man diese schrittweise – ohne alle Einträge auf einmal in den Arbeitsspeicher zu laden – verarbeiten möchte. Im Gegensatz zu scandir(), das ein vollständiges Array zurückgibt, liefert opendir() plus readdir() einen speicherschonenden Stream-basierten Ansatz.
Über den optionalen Parameter $context lassen sich Stream-Kontexte übergeben, was vor allem beim Zugriff auf entfernte Verzeichnisse (z. B. über FTP oder HTTP-Wrapper) relevant ist.
Nach der Verwendung sollte das Handle stets mit closedir() geschlossen werden, um Ressourcen freizugeben. Die Einträge . (aktuelles Verzeichnis) und .. (übergeordnetes Verzeichnis) werden von readdir() ebenfalls zurückgegeben und müssen bei Bedarf manuell herausgefiltert werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $path Pflicht | string | Der Pfad des zu öffnenden Verzeichnisses. Kann ein relativer oder absoluter Dateisystempfad oder ein Stream-URL (z. B. ftp://...) sein. |
|
| $context | resource|null | null | Ein optionaler Stream-Kontext, der mit stream_context_create() erstellt wurde. Wird hauptsächlich bei Remote-Verzeichnissen (FTP, HTTP) benötigt. |
Rückgabewert
readdir(), rewinddir() und closedir() verwendet werden kann. Schlägt das Öffnen fehl (z. B. Verzeichnis nicht vorhanden oder fehlende Berechtigungen), wird false zurückgegeben und ein Fehler der Stufe E_WARNING ausgelöst.Beispiele
Alle Dateien in einem Verzeichnis auflisten
<?php
$verzeichnis = '/var/www/uploads';
$handle = opendir($verzeichnis);
if ($handle === false) {
echo 'Verzeichnis konnte nicht geöffnet werden.';
exit;
}
while (($eintrag = readdir($handle)) !== false) {
// Aktuelle und übergeordnete Verzeichnis-Einträge überspringen
if ($eintrag === '.' || $eintrag === '..') {
continue;
}
echo $eintrag . PHP_EOL;
}
closendir($handle);
Nur Dateien (keine Unterverzeichnisse) filtern
<?php
$pfad = __DIR__ . '/daten';
$handle = opendir($pfad);
if ($handle === false) {
throw new RuntimeException('Verzeichnis nicht lesbar: ' . $pfad);
}
$dateien = [];
while (($eintrag = readdir($handle)) !== false) {
$vollPfad = $pfad . DIRECTORY_SEPARATOR . $eintrag;
if (is_file($vollPfad)) {
$dateien[] = $eintrag;
}
}
closendir($handle);
sort($dateien);
foreach ($dateien as $datei) {
echo $datei . PHP_EOL;
}
// Wichtig · Fallstricke
Fehlerbehandlung: Prüfe den Rückgabewert immer mit === false, da ein gültiges Handle bei einer Typprüfung mit == zu unerwarteten Ergebnissen führen kann. Alternativ kann @opendir() genutzt werden, um die E_WARNING-Ausgabe zu unterdrücken – besser ist jedoch das explizite Prüfen des Rückgabewerts.
Ressourcen freigeben: Vergiss nicht, closedir() nach der Verwendung aufzurufen, um das Verzeichnis-Handle zu schließen und Betriebssystem-Ressourcen freizugeben.
Einträge . und ..: readdir() gibt immer auch das aktuelle (.) und das übergeordnete (..) Verzeichnis zurück. Diese müssen im Code explizit übersprungen werden, um Endlosschleifen oder fehlerhafte Verarbeitung zu vermeiden.
Alternative: Für einfachere Anwendungsfälle bietet sich scandir() an. Für objektorientiertes Traversieren steht DirectoryIterator zur Verfügung, welche automatisch . und .. kennzeichnet.