PHP使用SPL迭代器递归删除空目录

时间:2012-05-15 22:39:18

标签: php iterator

我正在努力解决如何使用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等来执行此操作。请不要提供这些/类似功能的解决方案。

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

1 个答案:

答案 0 :(得分:9)

RecursiveIteratorIterator执行子目录的实际访问。 RecursiveDirectoryIterator仅为其提供句柄。

因此,您需要在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