【问题标题】:PHP Delete Directory that is not empty [duplicate]PHP删除不为空的目录[重复]
【发布时间】:2011-11-09 10:09:16
【问题描述】:

可能重复:
how to delete a folder with contents using PHP

我知道您可以使用 rmdir 删除一个空文件夹。而且我知道您可以使用以下三行清除文件夹。

foreach($directory_path as $file) {
       unlink($file);
}

但是如果其中一个文件实际上是子目录怎么办。一个人将如何摆脱它,但像双镜效应一样无限量。 php中有强制删除目录吗?

谢谢

【问题讨论】:

    标签: php directory


    【解决方案1】:

    来自 PHP rmdir 页面:

    <?php 
     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); 
       } 
     } 
    ?>
    

    <?php 
    function delTree($dir) { 
        $files = glob( $dir . '*', GLOB_MARK ); 
        foreach( $files as $file ){ 
            if( substr( $file, -1 ) == '/' ) 
                delTree( $file ); 
            else 
                unlink( $file ); 
        } 
    
        if (is_dir($dir)) rmdir( $dir ); 
    
    } 
    ?>
    

    【讨论】:

    • 非常感谢,第一个功能完美运行!
    【解决方案2】:
    <?php 
     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); 
       } 
     } 
    ?>
    

    来自 PHP 的文档

    【讨论】:

      【解决方案3】:

      这个函数会递归删除一个目录:

      function rmdir_recursive($dir) {
          foreach(scandir($dir) as $file) {
              if ('.' === $file || '..' === $file) continue;
              if (is_dir("$dir/$file")) rmdir_recursive("$dir/$file");
              else unlink("$dir/$file");
          }
          rmdir($dir);
      }
      

      这个也是:

      function rmdir_recursive($dir) {
          $it = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
          $it = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
          foreach($it as $file) {
              if ($file->isDir()) rmdir($file->getPathname());
              else unlink($file->getPathname());
          }
          rmdir($dir);
      }
      

      【讨论】:

      • 其实你可以使用 RecursiveDirectoryIterator::SKIP_DOTS 标志来避免第一个 if 语句...
      • SKIP_DOTS 在文档中不存在,您在哪里找到的?
      • SKIP_DOTS 在这里被引用:FilesystemIterator documentation。它继承自父类FilesystemIterator
      • 第一个函数如果参数是正确的路径但不存在则返回错误
      猜你喜欢
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 2019-05-02
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多