我正在努力解决如何使用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迭代器递归删除空目录树?注意:我知道如何使用glob
,scandir
等来执行此操作。请不要提供这些/类似功能的解决方案。
我觉得我必须在这里错过一些非常基本的东西......
答案 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