Как я удаляю каталог и его все содержание (файлы и подкаталоги) в PHP?
Пользовательский раздел на странице руководства rmdir
содержит достойную реализацию:
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (is_dir($dir."/".$object) && !is_link($dir."/".$object))
rrmdir($dir."/".$object);
else
unlink($dir."/".$object);
}
}
rmdir($dir);
}
}
Для * nix вы можете использовать shell_exec
для rm -R
или DEL / S имя_папки
для Windows.
На основе Комментарий разработчика Pixel , фрагмент, использующий SPL, может выглядеть так:
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($files as $fileinfo) {
$todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
$todo($fileinfo->getRealPath());
}
rmdir($dir);
Примечание: он не выполняет никакой проверки работоспособности и использует флаг SKIP_DOTS, представленный с FilesystemIterator в PHP 5.3.0. Конечно, $ todo
может быть if
/ else
. Важным моментом является то, что CHILD_FIRST
используется для перебора дочерних элементов (файлов) сначала перед их родительскими (папками).