В 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.