I’m struggling with how to delete a tree of empty directories in PHP using SPL iterators. Consider the following directory structure in which all directories are empty:
/topdir
level1 level2
I’ve tried the following:
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(
'/topdir', RecursiveIteratorIterator::CHILD_FIRST
));
foreach ($it as $file) {
if ($file->isDir()) {
rmdir((string)$file);
}
}
But RecursiveIteratorIterator::CHILD_FIRST prevents the bottom level file from being part of the loop and I get the standard Directory not empty E_WARNING because level1 is not empty.
How do I recursively delete a tree of empty directories using SPL Iterators? Note: I know how to do this with glob, scandir, etc. Please do not offer these/similar functions as solutions.
I feel like I must be missing something very elementary here …
It is the
RecursiveIteratorIteratorthat does the actual visiting of the child-directories. TheRecursiveDirectoryIteratoronly provides the handles for it.Therefore, you need to set the CHILD_FIRST flag on the
RecursiveIteratorIteratorand not on theRecursiveDirectoryIterator:To prevent warnings also add the
::SKIP_DOTSflag toRecursiveDirectoryIterator