Löschen ohne Rücksichtnahme auf Verluste?

Alles, was PHP betrifft, kann hier besprochen werden.

Löschen ohne Rücksichtnahme auf Verluste?

Postby tromorow » 02. May 2004 16:01

Hi Leute,

habe mal wider ein Problem :oops: (Oh mein Gott der schon wieder :roll: ) :!:

Ja ich mal wieder und zwar:

Ich möchte gerne einen Ordner löschen der mehrere Unterordner mit Dateien enthält!
Die Dateien und Ordner variieren, d.h. ich kann sie nicht fest in das Programm schreiben!
Gibt es eine Möglichkeit einen Ordner mit gesamtem Inhalt zu löschen (ohne Unix oder Windows befehle) :?:

Oder wist ihr einen Trick :?:
tromorow
 
Posts: 84
Joined: 13. January 2004 18:00
Location: "Sturgot" oder auch Stuttgart (zumindes irgend wo da)

Postby Stefan » 03. May 2004 08:26

Morsche,

der Kremple ist schon älter, müsste aber dennoch funktionieren.

die Funktion:
Code: Select all
<?php

// 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 ($pfad) {
    if (!is_dir ($pfad)) {                          // schau' nach, ob das ueberhaupt ein Verzeichnis ist

        return -1;
    }
    $dir = @opendir ($pfad);                        // oeffne das Verzeichnis

    // Fehler?
    if (!$dir) {
        return -2;
    }

    // gehe durch das Verzeichnis
    while ($eintrag = @readdir($dir)) {
        // wenn der Eintrag das aktuelle Verzeichnis oder das Elternverzeichnis ist,
        // ignoriere es.
        if ($eintrag == '.' || $eintrag == '..') continue;

        if (is_dir ($pfad.'/'.$eintrag)) {          // wenn der Eintrag ein Verzeichnis ist, dann
            $res = rec_rmdir ($pfad.'/'.$eintrag);  // rufe mich selbst auf

            // Fehler gefunden?
            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 ($pfad.'/'.$eintrag) || is_link ($pfad.'/'.$eintrag)) {
            // Ansonsten loesche diese Datei / diesen Link
            $res = @unlink ($pfad.'/'.$eintrag);
            if (!$res) {                            // Fehler?
              @closedir ($dir);                     // Verzeichnis schliessen
              return -2; // melde ihn
            }
        } else {                                    // ein nicht unterstuetzer Dateityp
            @closedir ($dir);                       // Verzeichnis schliessen
            return -3;                              // tut mir schrecklich leid...
        }
    }

    @closedir ($dir);                               // schliesse nun das Verzeichnis
    $res = @rmdir ($pfad);                          // versuche nun, das Verzeichnis zu loeschen

    // gab's einen Fehler?
    if (!$res) {
        return -2; // melde ihn
    }

    // Wenn bis hierhin gekommen, ist alles OK
    return 0;
}

?>


Der Aufruf mit Beispiel der Fehlerrückgaben
Code: Select all
<?php

$verzeichnis ="/tmp/phploeschen";   // Das Verzeichnis kommt dann per POST oder GET oder sonstwo her.
   
 // importiere die Datei mit der Funktion wenn ausgelagert
    //require 'rekursiv_loeschen.inc.php';
   
    // loesche das Verzeichnis aus Variablen $verzeichnis
    $res = rec_rmdir ($verzeichnis);
    // Was gibt die Funktion zurück?
    switch ($res) {
      case 0:
       $meldung = "Verzeichnis '".$verzeichnis."' gelöscht"; // das Verzeichnis wurde korrekt gelöscht
      break;
      case -1:
       $meldung = "Fehler! Wert '".$verzeichnis."' war kein Verzeichnis"; // das war kein Verzeichnis
      break;
      case -2:
        $meldung = "Fehler!";                                             // ein Fehler ist aufgetreten
      break;
      case -3:
        $meldung = "Fehler! Unbekannter Dateityp";  // die Funktion ist über einen Dateityp gestolpert, den sie nicht kennt
      break;
      default:
        $meldung = "Fehler! Unbekannter Fehler";  // die Funktion hat irgend etwas zurückgegeben, was sie eigentlich nicht sollte
      break;
    }
?>


[...<HTML> ...]

<?php
  echo $meldung;
?>


hoffe es hilft...

ciao, Stefan
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Postby tromorow » 03. May 2004 16:29

Ja genau des hab ich auch gefunden aber des tut manchmal und dann mal wieder net!
tromorow
 
Posts: 84
Joined: 13. January 2004 18:00
Location: "Sturgot" oder auch Stuttgart (zumindes irgend wo da)

Postby tromorow » 03. May 2004 16:37

OK glaube habe den Fehler gefunden!

hatte im ordner noch nen Dateizeiger offen!
tromorow
 
Posts: 84
Joined: 13. January 2004 18:00
Location: "Sturgot" oder auch Stuttgart (zumindes irgend wo da)


Return to PHP

Who is online

Users browsing this forum: No registered users and 22 guests