PHP Löschen eines Verzeichnisses inkl. Dateien funktioniert nicht.
Margit Kraus
- webserver
0 Der Martin0 Rolf B0 Raketenwilli
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
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
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
<?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