Start · Sprachen · PHP · Referenz · rmdir

rmdir

Funktion

Löscht ein leeres Verzeichnis aus dem Dateisystem.

seit PHP 4.0.0 Kategorie: io

Signatur

rmdir(string $directory, ?resource $context = null): bool

Beschreibung

rmdir() entfernt das angegebene Verzeichnis aus dem Dateisystem. Das Verzeichnis muss leer sein und der laufende Prozess muss über die entsprechenden Berechtigungen verfügen, andernfalls schlägt die Funktion fehl und gibt false zurück.

Soll ein Verzeichnis rekursiv gelöscht werden (d. h. inklusive aller Unterverzeichnisse und Dateien), muss zunächst der Inhalt manuell entfernt werden – z. B. mit einer rekursiven Hilfsfunktion oder glob() –, da PHP keine eingebaute Entsprechung zu rm -rf kennt.

Über den optionalen Parameter context lässt sich ein Stream-Kontext übergeben, der z. B. bei Netzwerkdateisystemen (FTP, SSH2) nützlich ist und das Verhalten des Löschvorgangs beeinflusst.

Schlägt der Aufruf fehl, wird ein E_WARNING ausgelöst. Mit dem Fehlerunterdrückungsoperator @ oder einer eigenen Fehlerbehandlung lässt sich das steuern.

Parameter

Name Typ Default Beschreibung
$directory Pflicht string Pfad zum zu löschenden Verzeichnis. Kann relativ oder absolut angegeben werden.
$context resource|null null Optionaler Stream-Kontext, erstellt z. B. mit stream_context_create(). Nützlich beim Arbeiten mit Netzwerkdateisystemen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Verzeichnis erfolgreich gelöscht wurde, andernfalls false. Ein Fehlschlag tritt auf, wenn das Verzeichnis nicht leer ist, nicht existiert oder die Berechtigungen fehlen.

Beispiele

Einfaches Löschen eines leeren Verzeichnisses

<?php
$dir = '/tmp/mein_verzeichnis';

// Verzeichnis anlegen
mkdir($dir);

// Verzeichnis wieder löschen
if (rmdir($dir)) {
    echo "Verzeichnis erfolgreich gelöscht.";
} else {
    echo "Löschen fehlgeschlagen.";
}
Verzeichnis erfolgreich gelöscht.

Rekursives Löschen eines Verzeichnisses mit Inhalt

<?php
function rmdir_rekursiv(string $pfad): bool
{
    if (!is_dir($pfad)) {
        return false;
    }

    $eintraege = array_diff(scandir($pfad), ['.', '..']);

    foreach ($eintraege as $eintrag) {
        $vollpfad = $pfad . DIRECTORY_SEPARATOR . $eintrag;
        if (is_dir($vollpfad)) {
            rmdir_rekursiv($vollpfad);
        } else {
            unlink($vollpfad);
        }
    }

    return rmdir($pfad);
}

// Teststruktur anlegen
mkdir('/tmp/test_baum/unterordner', 0777, true);
file_put_contents('/tmp/test_baum/unterordner/datei.txt', 'Inhalt');

// Gesamten Baum löschen
if (rmdir_rekursiv('/tmp/test_baum')) {
    echo "Verzeichnisbaum vollständig gelöscht.";
} else {
    echo "Löschen fehlgeschlagen.";
}
Verzeichnisbaum vollständig gelöscht.

// Wichtig · Fallstricke

Sicherheitshinweis: Übergeben Sie niemals ungeprüfte Benutzereingaben direkt an rmdir(). Ein Angreifer könnte durch Path-Traversal-Sequenzen wie ../../ beliebige Verzeichnisse auf dem Server löschen. Validieren und canonicalisieren Sie Pfade stets mit realpath() und prüfen Sie, ob der Pfad innerhalb des erlaubten Basisverzeichnisses liegt.

Auf Windows-Systemen kann das Löschen fehlschlagen, wenn das Verzeichnis oder eine darin enthaltene Datei noch von einem anderen Prozess geöffnet ist.

Keine rekursive Löschung: Anders als der Unix-Befehl rm -r löscht rmdir() ausschließlich leere Verzeichnisse. Für rekursives Löschen ist eine eigene Implementierung erforderlich (siehe Beispiel 2).