0

可能重复:
如何在 PHP 中递归删除目录及其全部内容(文件+子目录)?

我需要递归删除不为空的目录和子目录。我找不到任何有用的类或函数来解决这个问题。

提前感谢您的回答。

4

3 回答 3

22

来自官方文档中的第一条评论。

http://php.net/manual/en/function.rmdir.php

<?php

 // When the directory is not empty:
 function rrmdir($dir) {
   if (is_dir($dir)) {
     $objects = scandir($dir);
     foreach ($objects as $object) {
       if ($object != "." && $object != "..") {
         if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
       }
     }
     reset($objects);
     rmdir($dir);
   }
 }

?>

将 rmdir 编辑为 rrmdir 以纠正拼写错误,以创建递归函数的明显意图。

于 2012-03-18T17:34:31.227 回答
3

像这样的事情应该这样做......

function removeDir($path) {

    // Normalise $path.
    $path = rtrim($path, '/') . '/';

    // Remove all child files and directories.
    $items = glob($path . '*');

    foreach($items as $item) {
        is_dir($item) ? removeDir($item) : unlink($item);
    }

    // Remove directory.
    rmdir($path);
}

removeDir('/path/to/dir');

这将删除所有子文件和文件夹,然后删除传递给它的顶级文件夹。

它可以进行一些错误检查,例如测试提供的路径是一个目录并确保每次删除都成功。

于 2012-03-18T17:36:18.140 回答
0

要递归删除目录,请使用:

function rrmdir($path) {
    return is_file($path)? @unlink($path): array_map(__NAMESPACE__ . '\rrmdir',glob($path.'/*'))==@rmdir($path);
}

仅在 unix 上测试。

于 2012-03-18T17:35:39.060 回答