【问题标题】:PHP: Simplest way to delete a folder (including its contents)PHP:删除文件夹(包括其内容)的最简单方法
【发布时间】:2010-11-20 18:24:41
【问题描述】:

如果文件夹包含任何文件,rmdir() 函数将失败。我可以像这样遍历目录中的所有文件:

foreach (scandir($dir) as $item) {
    if ($item == '.' || $item == '..') continue;
    unlink($dir.DIRECTORY_SEPARATOR.$item);
}
rmdir($dir);

有什么方法可以一次性删除吗?

【问题讨论】:

    标签: php file-io delete-directory


    【解决方案1】:

    lprent 位于 php cmets 中的一个安全且良好的功能 它可以防止意外删除位于当前目录中的符号链接目录的内容

    public static function delTree($dir) { 
       $files = array_diff(scandir($dir), array('.','..')); 
        foreach ($files as $file) { 
          (is_dir("$dir/$file") && !is_link($dir)) ? delTree("$dir/$file") : unlink("$dir/$file"); 
        } 
        return rmdir($dir); 
      } 
    

    【讨论】:

      【解决方案2】:

      此功能删除目录及所有子目录和文件:

      function DelDir($target) {
          if(is_dir($target)) {
              $files = glob( $target . '*', GLOB_MARK ); //GLOB_MARK adds a slash to directories returned
      
              foreach( $files as $file )
              {
                  DelDir( $file );      
              }
      
              rmdir( $target );
          } elseif(is_file($target)) {
              unlink( $target );  
          }
      }
      

      【讨论】:

        【解决方案3】:
        function delete_files($dir) {
          if (is_dir($dir)) {
            $objects = scandir($dir);
            foreach ($objects as $object) {
              if ($object != "." && $object != "..") {
                if (filetype($dir."/".$object) == "dir") 
                   delete_files($dir."/".$object); 
                else unlink   ($dir."/".$object);
              }
            }
            reset($objects);
            rmdir($dir);
          }
         }
        

        【讨论】:

          【解决方案4】:

          试试这个:

          exec('rm -rf '.$user_dir);

          【讨论】:

          • 永远不会!你必须逃避 $user_dir!请添加 escapeshellarg($user_dir)
          • 不安全且更糟:取决于您的操作系统...例如,这在 Windows 系统上会失败...
          【解决方案5】:

          rrmdir() -- 递归删除目录:

          function rrmdir($dir) { 
            foreach(glob($dir . '/*') as $file) { 
              if(is_dir($file)) rrmdir($file); else unlink($file); 
            } rmdir($dir); 
          }
          

          【讨论】:

          • 我曾经使用这个功能删除了我的整个项目,小心!
          • @gskema,你的评论让我笑了!!!我只能想象“ohhhh shhiiiiittttt”的时刻。我希望你能把它全部拿回来!
          • @silversunhunter 实际上,我没有。当unlink 删除某些东西时,它意味着它。好在这只是一个测试项目。今日课程:使用远程 VCS
          • @gskema,我很同情。我真的只是不小心删除了我的整个网站。感谢上帝,我有备份。
          • @TricksfortheWeb 你的名字签出:D
          【解决方案6】:

          嗯,总会有的

          system('/bin/rm -rf ' . escapeshellarg($dir));
          

          如果有的话。

          【讨论】:

          • @KashifRaza:对。因此“在可用的地方”。
          • 在 Windows 上使用这个:system('rd /Q /S "' . $dir . '"');
          【解决方案7】:

          根据this来源;

          节省一些时间,如果您想清理或删除目录并且您在 Windows 上。

          使用这个:

              chdir ($file_system_path);
              exec ("del *.* /s /q");
          

          您可以使用其他 DEL 语法或任何其他 shell 实用程序。 您可能必须允许服务与桌面交互,因为这是我当前的设置,我不会更改它来测试它。

          否则你可以找到另一种方法here.

          【讨论】:

          • 不得不依赖你的操作系统是个坏主意...这只适用于 Windows 并且会在 Unix 系统上失败...
          猜你喜欢
          • 2014-04-19
          • 1970-01-01
          • 2011-05-21
          • 2012-09-19
          • 2014-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多