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

2022-08-30 06:43:33

如何在PHP中删除目录及其全部内容(文件和子目录)?


答案 1

rmdir 手册页中的用户贡献部分包含一个不错的实现:

 function rrmdir($dir) { 
   if (is_dir($dir)) { 
     $objects = scandir($dir);
     foreach ($objects as $object) { 
       if ($object != "." && $object != "..") { 
         if (is_dir($dir. DIRECTORY_SEPARATOR .$object) && !is_link($dir."/".$object))
           rrmdir($dir. DIRECTORY_SEPARATOR .$object);
         else
           unlink($dir. DIRECTORY_SEPARATOR .$object); 
       } 
     }
     rmdir($dir); 
   } 
 }

答案 2

根据 Pixel Developer 的评论,使用 SPL 的代码段可能如下所示:

$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
    RecursiveIteratorIterator::CHILD_FIRST
);

foreach ($files as $fileinfo) {
    $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
    $todo($fileinfo->getRealPath());
}

rmdir($dir);

注意:它进行健全性检查,而是使用 PHP 5.3.0 中随文件系统编辑器引入的 SKIP_DOTS 标志。当然,$todo可以是一个if/else。重要的一点是,CHILD_FIRST用于先循环访问子项(文件),然后再循环访问其父项(文件夹)。


推荐