Start · Sprachen · PHP · Referenz · closedir

closedir

Funktion

Schließt ein zuvor mit <code>opendir()</code> geöffnetes Verzeichnis-Handle und gibt die zugehörigen Ressourcen frei.

seit PHP 4.0.0 Kategorie: io

Signatur

closedir(resource $dir_handle = null): void

Beschreibung

closedir() schließt ein Verzeichnis-Handle, das zuvor mit opendir() geöffnet wurde. Nach dem Aufruf ist das Handle ungültig und sollte nicht mehr verwendet werden. Die Funktion gibt alle mit dem Handle verbundenen Systemressourcen frei.

In der Praxis ist es wichtig, geöffnete Verzeichnis-Handles nach der Verwendung zu schließen, um Ressourcenlecks zu vermeiden – insbesondere in lang laufenden Prozessen oder Skripten, die viele Verzeichnisse verarbeiten. Bei modernen PHP-Versionen werden Handles zwar am Ende des Skripts automatisch geschlossen, explizites Schließen gilt jedoch als guter Programmierstil.

Wird closedir() ohne Argument aufgerufen, wird das zuletzt mit opendir() geöffnete Handle geschlossen. Es empfiehlt sich jedoch, das Handle stets explizit zu übergeben, um Verwechslungen bei mehreren gleichzeitig geöffneten Verzeichnissen zu vermeiden.

Parameter

Name Typ Default Beschreibung
$dir_handle resource null Das Verzeichnis-Handle, das mit opendir() geöffnet wurde. Wird kein Handle übergeben, wird das zuletzt geöffnete Verzeichnis-Handle geschlossen.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

Beispiele

Verzeichnis einlesen und Handle schließen

<?php
$verzeichnis = '/var/www/uploads';

$handle = opendir($verzeichnis);

if ($handle !== false) {
    while (($datei = readdir($handle)) !== false) {
        if ($datei !== '.' && $datei !== '..') {
            echo $datei . PHP_EOL;
        }
    }
    closedir($handle);
} else {
    echo 'Verzeichnis konnte nicht geöffnet werden.';
}
bild1.jpg dokument.pdf archiv.zip

Mehrere Verzeichnisse nacheinander verarbeiten

<?php
$verzeichnisse = ['/tmp/ordner1', '/tmp/ordner2'];

foreach ($verzeichnisse as $pfad) {
    $handle = opendir($pfad);
    if ($handle === false) {
        echo "Kann $pfad nicht öffnen." . PHP_EOL;
        continue;
    }

    echo "Inhalt von $pfad:" . PHP_EOL;
    while (($eintrag = readdir($handle)) !== false) {
        if ($eintrag !== '.' && $eintrag !== '..') {
            echo '  ' . $eintrag . PHP_EOL;
        }
    }

    closedir($handle); // Handle sofort nach Verwendung schließen
}
Inhalt von /tmp/ordner1: datei_a.txt Inhalt von /tmp/ordner2: datei_b.txt

// Wichtig · Fallstricke

Hinweis: Ab PHP 8.0 wird der Parameter $dir_handle nicht mehr als resource, sondern intern als resource|null behandelt. In modernen Projekten empfiehlt sich die Verwendung von scandir() oder der DirectoryIterator-Klasse als objektorientierte Alternative, da diese keine manuelle Ressourcenverwaltung erfordern.

Das Weglassen des Handles und der implizite Rückgriff auf das zuletzt geöffnete Verzeichnis kann bei verschachtelten oder parallelen Verzeichnis-Operationen zu schwer nachvollziehbaren Fehlern führen. Daher sollte das Handle immer explizit übergeben werden.