Hallo zusammen
ich wollte im eigenen Addon die Funktion rex_deleteFiles nutzen und bin erstmal auf die Nase gefallen. Nähere Code-Analyse zeigt dann die Ursache. Anbei die Analyse in einer verkürzten Code-darstellung::
Als Parameter wird ein Verzeichnisname erwartet. Der steht in $file. Das Verzeichnis wird in einer Schleife "while ... readdir()) durchlaufen. Für die jeweils gefundene Datei sollte nun ein "unlink" erfolgen. Passiert aber nicht, der unlink erfolgt auf das Verzeichnis $file, was konsequenterweise schiefgeht.
$handle = opendir($file);
while (false !== $filename = readdir($handle)) {
if (!@ unlink($file)) {
if ($debug) {
echo "Unable to delete file '$file'<br />\n";
}
return false;
}
}
closedir($handle);
Der Löschversuch sollte auf $file.DIRECTORY_SEPARATOR.$filename erfolgen. Außerdem muss abgefangen werden, dass in dem Verzeichnis auch Unterverzeichnisse sind (es heißt ja "deleteFiles"), denn bei einem Unterverzeichnis geht unlink ebenfalls auf die Bretter.
Mit dieser Variante klappt es:
while (false !== $filename = readdir($handle)) {
if ($filename == '.' || $filename == '..') {
continue;
}
$file2delete = $file.DIRECTORY_SEPARATOR.$filename;
if (@ is_dir($file2delete)) continue;
if (!@ unlink($file2delete)) {
if ($debug) {
echo "Unable to delete file '$file2delete'<br />\n";
}
return false;
}
}
closedir($handle);
Hallo zusammen ich wollte im eigenen Addon die Funktion rex_deleteFiles nutzen und bin erstmal auf die Nase gefallen. Nähere Code-Analyse zeigt dann die Ursache. Anbei die Analyse in einer verkürzten Code-darstellung:: Als Parameter wird ein Verzeichnisname erwartet. Der steht in $file. Das Verzeichnis wird in einer Schleife "while ... readdir()) durchlaufen. Für die jeweils gefundene Datei sollte nun ein "unlink" erfolgen. Passiert aber nicht, der unlink erfolgt auf das Verzeichnis $file, was konsequenterweise schiefgeht.
Der Löschversuch sollte auf $file.DIRECTORY_SEPARATOR.$filename erfolgen. Außerdem muss abgefangen werden, dass in dem Verzeichnis auch Unterverzeichnisse sind (es heißt ja "deleteFiles"), denn bei einem Unterverzeichnis geht unlink ebenfalls auf die Bretter.
Mit dieser Variante klappt es: while (false !== $filename = readdir($handle)) { if ($filename == '.' || $filename == '..') { continue; }
Ich setze Redaxo 4.6.1. ein.
Viele Grüße Chris