Ich muss einen Ordner mit Inhalt mit PHP löschen. rmdir()
und unlink()
löschen leere Ordner, können jedoch Ordner mit Inhalt nicht löschen.
Mit dieser Funktion können Sie jeden Ordner (sofern er beschreibbar ist) und die darin enthaltenen Dateien und Unterverzeichnisse löschen.
function Delete($path)
{
if (is_dir($path) === true)
{
$files = array_diff(scandir($path), array('.', '..'));
foreach ($files as $file)
{
Delete(realpath($path) . '/' . $file);
}
return rmdir($path);
}
else if (is_file($path) === true)
{
return unlink($path);
}
return false;
}
Oder ohne Rekursion mit RecursiveDirectoryIterator
:
function Delete($path)
{
if (is_dir($path) === true)
{
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);
foreach ($files as $file)
{
if (in_array($file->getBasename(), array('.', '..')) !== true)
{
if ($file->isDir() === true)
{
rmdir($file->getPathName());
}
else if (($file->isFile() === true) || ($file->isLink() === true))
{
unlink($file->getPathname());
}
}
}
return rmdir($path);
}
else if ((is_file($path) === true) || (is_link($path) === true))
{
return unlink($path);
}
return false;
}
Sie müssen den Ordnerinhalt (einschließlich der Inhalte aller Unterordner) durchlaufen und zuerst entfernen.
Hier ist ein Beispiel: http://lixlpixel.org/recursive_function/php/recursive_directory_delete/
Sei vorsichtig damit !!!
Hier ist ein Skript, das genau das tut, was Sie brauchen:
/**
* Recursively delete a directory
*
* @param string $dir Directory name
* @param boolean $deleteRootToo Delete specified top-level directory as well
*/
function unlinkRecursive($dir, $deleteRootToo)
{
if(!$dh = @opendir($dir))
{
return;
}
while (false !== ($obj = readdir($dh)))
{
if($obj == '.' || $obj == '..')
{
continue;
}
if ([email protected]($dir . '/' . $obj))
{
unlinkRecursive($dir.'/'.$obj, true);
}
}
closedir($dh);
if ($deleteRootToo)
{
@rmdir($dir);
}
return;
}
Ich habe es von php.net bekommen und es funktioniert.
Es gibt keine einzige in PHP eingebaute Funktion, die dies erlaubt. Sie müssen Ihre eigene mit rmdir und unlink schreiben.
Ein Beispiel (aus einem Kommentar zu php.net docs ):
<?
// ensure $dir ends with a slash
function delTree($dir) {
$files = glob( $dir . '*', GLOB_MARK );
foreach( $files as $file ){
if( substr( $file, -1 ) == '/' )
delTree( $file );
else
unlink( $file );
}
rmdir( $dir );
}
?>
Sie müssen alle Dateien rekursiv löschen. In den Kommentaren der rmdir
-Manualpage gibt es viele Beispielfunktionen:
Sie könnten immer betrügen und tun Shell_exec("rm -rf /path/to/folder");