【问题标题】:Delete Directory and directories inside删除目录和里面的目录
【发布时间】:2014-03-17 20:19:38
【问题描述】:

我想删除一个目录及其所有子目录。

$folders('users','users/100282','users/100282/test');
array_map("rmdir",array_reverse($folders));

不幸的是,这不起作用。我收到 2 个错误,说目录不为空。如果我刷新,只有1个错误,如果我再次刷新,没有更多的错误。


发生的情况是脚本在执行前一个任务之前尝试删除父目录,这导致文件夹非空。 我该如何解决这个问题?

【问题讨论】:

  • 使用rm -rf directory 会更容易\更快
  • 我在另一个 stackoverflow 问题上读到了这一点,这在 windows XAMPP 上不起作用
  • 那么 Windows 的 dos 等效项:rmdir /q /s DIR
  • 我会试一试的。知道为什么这不起作用吗?
  • rmdir 用户注释有许多用于非空目录的递归函数,我会使用它们——如果我需要一种与操作系统无关的方法

标签: php filesystems directory unlink rmdir


【解决方案1】:

使用RecursiveIteratorIterator 来做这样的事情怎么样:

<?php 
/**
 * Recursive directory remover.
 *
 * @param string $dir
 * @return bool
 */
function destroy_dir($dir) {
    foreach(new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS),
                RecursiveIteratorIterator::CHILD_FIRST) as $path) {

        //remove file or folder
        $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname());
    }
    return rmdir($dir);
}

//usage
$dir = './users';
//checks
if(is_dir($dir)){
    //call
    if(destroy_dir($dir)){
        //directory removed
    }else{
        //error removing directory
    }
}else{
    //users directory not found
}

?>

【讨论】:

  • 它就像一个魅力。它是如何遍历目录的呢? CHILD_FIRST 是否告诉迭代器它应该从可能的最低目录开始?
  • 太棒了!谢谢!我添加了一小行代码来检查目录是否存在(我不小心拼错了 dir_name 并引发了警告)。可能是一个不错的补充。
  • 是的,应该在调用函数之前在根目录上完成,而不是在函数内,因为如果检查布尔值,它可能会混淆父代码,仅供参考:你可以找到很多关于迭代器类的信息在这里,我可以解释更多,stackoverflow.com/questions/12077177/…希望它有所帮助。
  • @NickySmits 检查更新,在调用它之前做检查,函数返回布尔值,如果你在函数中这样做,那么你将无法区分未找到的目录或某些权限问题等。祝你好运
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
相关资源
最近更新 更多