【问题标题】:PHP Recursively delete empty directories with SPL iteratorsPHP 使用 SPL 迭代器递归删除空目录
【发布时间】:2012-05-15 22:39:18
【问题描述】:

我正在努力解决如何使用 SPL 迭代器删除 PHP 中的空目录树。考虑以下所有目录为空的目录结构:

/topdir

  level1

       level2

我尝试了以下方法:

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(
    '/topdir', RecursiveIteratorIterator::CHILD_FIRST
));

foreach ($it as $file) {
    if ($file->isDir()) {
        rmdir((string)$file);
    }
}

但是RecursiveIteratorIterator::CHILD_FIRST 阻止底层文件成为循环的一部分,我得到标准的Directory not empty E_WARNING,因为 level1 不是空的。

如何使用 SPL 迭代器递归删除空目录树?注意:我知道如何使用globscandir 等来执行此操作。请不要提供这些/类似功能作为解决方案。

我觉得我必须在这里遗漏一些非常基本的东西......

【问题讨论】:

  • 您确定所有这些目录都只包含目录吗?
  • 好的是的,他们可能是,我能够用空目录重现这个错误。 :)
  • 是的。我已经创建了目录结构作为专门针对这个问题的健全性检查。

标签: php iterator


【解决方案1】:

实际访问子目录的是RecursiveIteratorIteratorRecursiveDirectoryIterator 只为其提供句柄。

因此,您需要在RecursiveIteratorIterator 而不是RecursiveDirectoryIterator 上设置CHILD_FIRST 标志:

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/topdir', FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST
);

foreach ($it as $file) {
    if ($file->isDir()) {
        rmdir((string)$file);
    }
}

为防止出现警告,还将::SKIP_DOTS 标志添加到RecursiveDirectoryIterator

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多