Art*_*cto 191

您是否尝试过手册页中的第一个注释rmdir

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

  • `rrmdir( '/'); // == rm -rf /`;) (3认同)
  • 看看有人给我的解决方案同样的问题:glob看起来效果更好:http://stackoverflow.com/questions/11267086/php-unlink-all-files-withing-a-directory-and-then-deleting-该目录 (2认同)

sal*_*the 110

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);
Run Code Online (Sandbox Code Playgroud)

注意:它没有进行健全性检查,并使用PHP 5.3.0中的FilesystemIterator引入的SKIP_DOTS标志.当然,$todo可能是if/ else.重要的是,CHILD_FIRST它用于在父(文件夹)之前首先迭代子(文件).

  • @Alix Axel,[r263239](http://svn.php.net/viewvc/?view=revision&revision=263239) (5认同)
  • 这个解决方案效果很好,但它会删除所有内容......除了目录(无论是否为空).在脚本的末尾应该有一个`rmdir($ dir)`. (3认同)
  • [这是相同的功能](https://gist.github.com/mindplay-dk/a4aad91f5a4f1283a5e2)解包,文档阻止,并与`rmdir()`和`unlink()`保持一致,例如中止` E_WARNING`并返回表示成功的"true"或"false". (3认同)
  • @dbf不行,FilesystemIterator不是一个递归的迭代器。 (2认同)

Lik*_*iko 16

删除路径中的所有文件和文件夹.

function recurseRmdir($dir) {
  $files = array_diff(scandir($dir), array('.','..'));
  foreach ($files as $file) {
    (is_dir("$dir/$file")) ? recurseRmdir("$dir/$file") : unlink("$dir/$file");
  }
  return rmdir($dir);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不是符号链接的安全!您需要在is_dir之后进行健全性检查以检查它是否是!is_link,因为否则您可以符号链接到外部文件夹,然后将其删除,这可能被视为安全漏洞.所以你应该把`is_dir("$ dir/$ file")`更改为`is_dir("$ dir/$ file")&&!is_link("$ dir/$ file")` (5认同)

ank*_*nfo 13

对于*nix,您可以使用shell_execfor rm -RDEL /S folder_namefor Windows.

  • 如何用于Windows的'DEL/S folder_name` (2认同)
  • @ WiR3D只要exec命令不包含用户输入,你应该是好的.例如:`exec('rm -rf'._ _ DIR__.'/ output/*.log');` (2认同)

Dav*_*omb 5

还有另一个带有更多示例的线程: PHP的递归删除目录函数?

如果您使用Yii,那么您可以将其留在框架中:

CFileHelper::removeDirectory($my_directory);
Run Code Online (Sandbox Code Playgroud)


Xza*_*zaR 5

<?php

use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use SplFileInfo;

# http://stackoverflow.com/a/3352564/283851
# https://gist.github.com/XzaR90/48c6b615be12fa765898

# Forked from https://gist.github.com/mindplay-dk/a4aad91f5a4f1283a5e2

/**
 * Recursively delete a directory and all of it's contents - e.g.the equivalent of `rm -r` on the command-line.
 * Consistent with `rmdir()` and `unlink()`, an E_WARNING level error will be generated on failure.
 *
 * @param string $source absolute path to directory or file to delete.
 * @param bool   $removeOnlyChildren set to true will only remove content inside directory.
 *
 * @return bool true on success; false on failure
 */
function rrmdir($source, $removeOnlyChildren = false)
{
    if(empty($source) || file_exists($source) === false)
    {
        return false;
    }

    if(is_file($source) || is_link($source))
    {
        return unlink($source);
    }

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

    //$fileinfo as SplFileInfo
    foreach($files as $fileinfo)
    {
        if($fileinfo->isDir())
        {
            if(rrmdir($fileinfo->getRealPath()) === false)
            {
                return false;
            }
        }
        else
        {
            if(unlink($fileinfo->getRealPath()) === false)
            {
                return false;
            }
        }
    }

    if($removeOnlyChildren === false)
    {
        return rmdir($source);
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 最优雅,干净,易读的;) (2认同)