Margit Kraus: PHP Löschen eines Verzeichnisses inkl. Dateien funktioniert nicht.

Ich habe ein Problem mit der Funktion rec_rmdir, die auf dieser Seite vorgestellt wird. https://wiki.selfhtml.org/wiki/PHP/Tutorials/Rekursives_Löschen_von_Verzeichnissen

Meine Verzeichnisstruktur: Index.php Unterverzeichnis: NeuerOrdner – darin befinden sich bild1.jpg, bild2.jpg.

Wenn das Verzeichnis NeuerOrdner leer ist, kann ich es mit der index.php und rmdir („NeuerOrdner“); problemlos löschen.

Wenn ich in der index.php den Code aus dem obigen Tutorial verwende (wenn „NeuerOrdner“ nicht leer ist), passiert nichts:

<?php

$path = „NeuerOrdner“;

// rec_rmdir - loesche ein Verzeichnis rekursiv
// Rueckgabewerte:
//   0  - alles ok
//   -1 - kein Verzeichnis
//   -2 - Fehler beim Loeschen
//   -3 - Ein Eintrag eines Verzeichnisses war keine Datei und kein Verzeichnis und
//        kein Link

function rec_rmdir ($path) {
    // schau' nach, ob das ueberhaupt ein Verzeichnis ist
    if (!is_dir ($path)) {
        return -1;
    }

    // oeffne das Verzeichnis
    $dir = @opendir ($path);
    
    // Fehler?
    if (!$dir) {
        return -2;
    }
    
    // gehe durch das Verzeichnis
    while ($entry = @readdir($dir)) {
        // wenn der Eintrag das aktuelle Verzeichnis oder das Elternverzeichnis
        // ist, ignoriere es
        if ($entry == '.' || $entry == '..') continue;
        // wenn der Eintrag ein Verzeichnis ist, dann 
        if (is_dir ($path.'/'.$entry)) {
            // rufe mich selbst auf
            $res = rec_rmdir ($path.'/'.$entry);
            // wenn ein Fehler aufgetreten ist
            if ($res == -1) { // dies duerfte gar nicht passieren
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // normalen Fehler melden
            } else if ($res == -2) { // Fehler?
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // Fehler weitergeben
            } else if ($res == -3) { // nicht unterstuetzer Dateityp?
                @closedir ($dir); // Verzeichnis schliessen
                return -3; // Fehler weitergeben
            } else if ($res != 0) { // das duerfe auch nicht passieren...
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // Fehler zurueck
            }
        } else if (is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry)) {
            // ansonsten loesche diese Datei / diesen Link
            $res = @unlink ($path.'/'.$entry);
            // Fehler?
            if (!$res) {
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // melde ihn
            }
        } else {
            // ein nicht unterstuetzer Dateityp
            @closedir ($dir); // Verzeichnis schliessen
            return -3; // tut mir schrecklich leid...
        }
    }
    
    // schliesse nun das Verzeichnis
    @closedir ($dir);
    
    // versuche nun, das Verzeichnis zu loeschen
    $res = @rmdir ($path);
    
    // gab's einen Fehler?
    if (!$res) {
        return -2; // melde ihn
    }
    
    // alles ok
    return 0;
}

?>

Wie Ihr seht kenn ich mich nicht aus. Auch wenn ich im gleichen Verzeichnis wie die index.php die Datei recrmdir.inc.php hineinstelle und die index.php wie folgt aussieht, funktioniert es nicht.

<?php
$path = „NeuerOrdner“;
require 'recrmdir.inc.php';
?>

Bitte welche Fehler mache ich bei der Parameter Übergabe? Danke schon mal für eure Hilfe!

GLG Margit

  1. Hallo,

    Ich habe ein Problem mit der Funktion rec_rmdir, die auf dieser Seite vorgestellt wird. https://wiki.selfhtml.org/wiki/PHP/Tutorials/Rekursives_Löschen_von_Verzeichnissen

    nur so aus der Hüfte geschossen: Hast du auch für alle Dateien und Verzeichnisse die Berechtigung, sie zu löschen?

    Einen schönen Tag noch
     Martin

    --
    Ich fürchte, ich brauche ein neues Portemonnaie. Das alte ist leer.
  2. Hallo Margit,

    ich sehe nicht, dass Du rec_rmdir überhaupt aufrufst. Der include allein genügt nicht.

    Wichtig zu wissen wäre auch der Wert, den die Funktion zurückgibt. Das liefert eine Idee, was schiefgeht.

    Wobei ich nicht sagen kann, dass ich die Funktion toll gemacht finde, das Fehlerhandling ist ziemlich übel. Man kann nur raten, was der Grund für einen Fehler ist, sowas sollte mit trigger_error oder einer exception gemeldet werden. Dann könnte man mehr über die Fehlerursache erfahren.

    Rolf

    --
    sumpsi - posui - obstruxi
  3. <?php
    $path = „NeuerOrdner“;
    require 'recrmdir.inc.php';
    ?>
    

    Bitte welche Fehler mache ich bei der Parameter Übergabe?

    Da Du nirgendwo einen Parameter übergibst: Gar keinen.

    1.)

    In diesem Thread finden sich modernere Varianten:

    https://forum.selfhtml.org/self/2022/may/13/verzeichnis-leeren/1799113#m1799113

    2.)

    $path = „NeuerOrdner“
    

    Das wirft einen Syntaxfehler und beendet schon das Linten/Parsen des Skriptes.

    3.) Wie Rolf schon schrieb (und im unter 1. verlinkten Skript unter '### Usage example:' nachzulesen ist): Du musst die Funktion auch aufrufen:

    <?php
    require 'rec_rmdir.inc.php'; # Skript mit Funktion `recrmdir()`
    rec_rmdir( 'Neuer Ordner' ); # Aufruf mit Parameter