В PHP как я рекурсивно удаляю все папки, которые не пусты?
Возможный дубликат:
Как я могу рекурсивно удалить каталог и все его содержимое (файлы + поддиректории) в PHP?
Мне нужно рекурсивно удалить каталог и подкаталоги, которые не являются пустыми. Я не могу найти какой-либо полезный класс или функцию для решения этой проблемы.
Заблаговременно спасибо за ваши ответы.
Ответы
Ответ 1
С первого комментария в официальной документации.
http://php.net/manual/en/function.rmdir.php
<?php
// When the directory is not empty:
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
}
}
?>
Отредактировано rmdir для rrmdir, чтобы исправить опечатку с очевидным намерением создать рекурсивную функцию.
Ответ 2
Что-то вроде этого должно это сделать...
function removeDir($path) {
// Normalise $path.
$path = rtrim($path, '/') . '/';
// Remove all child files and directories.
$items = glob($path . '*');
foreach($items as $item) {
is_dir($item) ? removeDir($item) : unlink($item);
}
// Remove directory.
rmdir($path);
}
removeDir('/path/to/dir');
Это удаляет все дочерние файлы и папки, а затем удаляет папку верхнего уровня, переданную ей.
Это может быть связано с некоторыми проверками ошибок, такими как тестирование поставляемого пути, является каталогом и гарантией успешного удаления.
Ответ 3
Чтобы рекурсивно удалить каталог, используйте это:
function rrmdir($path) {
return is_file($path)? @unlink($path): array_map(__NAMESPACE__ . '\rrmdir',glob($path.'/*'))[email protected]($path);
}
Проверено только на unix.