【问题标题】:Remove all files, folders and their subfolders with php [duplicate]使用 php 删除所有文件、文件夹及其子文件夹 [重复]
【发布时间】:2012-07-21 18:23:12
【问题描述】:

我需要一个可以删除整个目录及其所有子文件夹、文件等的脚本。我尝试了几个月前在互联网上找到的这个功能,但它不能完全工作。

function deleteFile($dir) {
    if(substr($dir, strlen($dir)-1, 1) != '/') { 
        $dir .= '/'; 
    }
    if($handle = opendir($dir)) { 
        while($obj = readdir($handle)) { 
            if($obj != '.' && $obj != '..') { 
                if(is_dir($dir.$obj)) { 
                    if(!deleteFile($dir.$obj)) {
                        echo $dir.$obj."<br />";
                        return false;
                    }
                }
                elseif(is_file($dir.$obj)) { 
                    if(!unlink($dir.$obj)) {
                        echo $dir.$obj."<br />";
                        return false;
                    }
                }
            }
        }
        closedir($handle); 
        if(!@rmdir($dir)) {
            echo $dir.'<br />';
            return false;
        }
        return true;
    }
    return true;
}

对于测试,我使用了 prestashop 的解压缩存档,并尝试删除解压缩存档的文件夹,但它不起作用。

/home/***/public_html/prestashop/img/p/3/
/home/***/public_html/prestashop/img/p/3
/home/***/public_html/prestashop/img/p
/home/***/public_html/prestashop/img

这些是问题文件夹。第一次我想 - “可能是文件的 chmod 有问题”,但是当我测试所有文件 chmod 权限 755(之后是 777)时 - 结果是一样的。

【问题讨论】:

    标签: php file-io directory subdirectory


    【解决方案1】:
    <?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.net试试上面的代码

    对我来说很好用

    【讨论】:

    • 哇,它运行得又快又完美!谢谢你,伙计!
    • 这是一个非常好的例子。它确实会删除文件和子文件夹。
    • 好答案唐纳德。我知道这对大多数人来说是显而易见的,但我认为它需要说:使用此功能(或此页面上的任何其他功能)时要非常小心。如果您给它错误的参数,它可以(并且将会)清除您的整个网站。
    • 有没有办法检测成功删除文件夹?喜欢它返回 true 吗?
    • 看看php.net/manual/en/function.rmdir.php rmdir() return bool ... 这样就可以用了
    【解决方案2】:
    function delete_files($dir) { 
      foreach(glob($dir . '/*') as $file) { 
        if(is_dir($file)) delete_files($file); else unlink($file); 
      } rmdir($dir); 
    }
    

    【讨论】:

    • 添加一些文字,你至少应该说点什么,而不仅仅是转储代码。即使是“这应该可以解决问题:”也可以。
    • 如果初始文件夹错误,glob() 将返回 false 并出现错误。最好测试 'if is_dir($dir)' 作为第一条指令,成功时可能返回 true,否则返回 false。无论如何,它会考虑每个条目。如果它是一个目录,它会被递归调用“delete_file”删除,否则它是一个文件,它会被 unlink() 删除。最后 $dir 为空,因此可以使用 'rmdir' 将其删除。
    【解决方案3】:

    您可以使用更简洁的方法来递归删除目录。

    例子:

    function recursiveRemove($dir) {
        $structure = glob(rtrim($dir, "/").'/*');
        if (is_array($structure)) {
            foreach($structure as $file) {
                if (is_dir($file)) recursiveRemove($file);
                elseif (is_file($file)) unlink($file);
            }
        }
        rmdir($dir);
    }
    

    用法:

    recursiveRemove("test/dir/");
    

    【讨论】:

      【解决方案4】:

      使用system()方法的最简单最好的方法

      $dir = dirname ( "/log" );
      if ($handle = opendir($dir)) {
          while (( $file = readdir($handle)) !== false ) {
              if ($file != "." && $file != "..") {
                  system("rm -rf ".escapeshellarg($dir.'/'.$file));
              }
          }
      }
      closedir($handle);
      

      【讨论】:

      • 如果您无法访问 shell(对于许多托管服务),我认为您不能使用“系统”方法。
      【解决方案5】:
      /**
       * Deletes a directory and all files and folders under it
       * @return Null
       * @param $dir String Directory Path
       */
      function rmdir_files($dir) {
       $dh = opendir($dir);
       if ($dh) {
        while($file = readdir($dh)) {
         if (!in_array($file, array('.', '..'))) {
          if (is_file($dir.$file)) {
           unlink($dir.$file);
          }
          else if (is_dir($dir.$file)) {
           rmdir_files($dir.$file);
          }
         }
        }
        rmdir($dir);
       }
      }
      

      【讨论】:

      • 它的功能相同,但有很多错误:)
      • 不能说有很多错误,因为它对我有用,但它太危险了。
      猜你喜欢
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2019-02-16
      • 2017-12-21
      • 2011-07-19
      相关资源
      最近更新 更多