Start · Sprachen · PHP · Referenz · opendir

opendir

Funktion

Öffnet ein Verzeichnis-Handle zum iterativen Lesen von Verzeichniseinträgen mit <code>readdir()</code>.

seit PHP 4.0.0 Kategorie: io

Signatur

opendir(string $path, ?resource $context = null): resource|false

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

Typ
resource|false
Beschreibung
Gibt ein Verzeichnis-Handle (eine Ressource) zurück, das mit 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);
bild1.jpg dokument.pdf archiv.zip

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;
}
config.json log.txt nutzer.csv

// 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.