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