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 RecursiveIteratorIterator
that does the actual visiting of the child-directories. The RecursiveDirectoryIterator
only provides the handles for it.
Therefore, you need to set the CHILD_FIRST flag on the RecursiveIteratorIterator
and not on the RecursiveDirectoryIterator
:
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/topdir', FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($it as $file) {
if ($file->isDir()) {
rmdir((string)$file);
}
}
To prevent warnings also add the ::SKIP_DOTS
flag to RecursiveDirectoryIterator
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With