Как в PHP рекурсивно удалить все непустые папки?

Возможный дубликат:
Как рекурсивно удалить каталог и все его содержимое (файлы + подкаталоги) в PHP?

Мне нужно рекурсивно удалить каталог и подкаталоги, которые не пусты. Я не могу найти полезного класса или функции для решения этой проблемы.

Заранее благодарю за ответы.


person Lukáš Jelič    schedule 18.03.2012    source источник
comment
Использование функции поиска (как я только что сделал) дало бы вам ответ: stackoverflow.com/questions/3338123/   -  person Sebastian Wramba    schedule 18.03.2012
comment
lixlpixel.org/recursive_function/php/recursive_directory_delete   -  person rjz    schedule 18.03.2012


Ответы (3)


Из первого комментария в официальной документации.

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, чтобы исправить опечатку из-за очевидного намерения создать рекурсивную функцию.

person lorenzo-s    schedule 18.03.2012
comment
Произошла опечатка, из-за которой глубокие уровни каталогов не работают. if (filetype ($ dir ./.$ object) == dir) rmdir ($ dir ./.$ объект); должен быть rrmdir, чтобы снова вызвать функцию ... В противном случае - круто! - person amurrell; 18.06.2014

Что-то вроде этого должно сработать ...

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');

Это удаляет все дочерние файлы и папки, а затем удаляет переданную ему папку верхнего уровня.

Это может быть связано с некоторой проверкой ошибок, например проверкой указанного пути в каталоге и проверкой каждого удаления успешно.

person alex    schedule 18.03.2012
comment
если есть подпапки с файлами, эта функция не работает .. удалите, пожалуйста, ваш пост, чтобы не тратить зря время пользователей .. - person T.Todua; 26.11.2014
comment
@tazotodua Вместо того, чтобы писать плохо построенное предложение, в котором говорится, что оно не работает, почему бы вам не объяснить, почему это не работает, чтобы я мог это исправить? - person alex; 27.11.2014

Чтобы рекурсивно удалить каталог, используйте это:

function rrmdir($path) {
    return is_file($path)? @unlink($path): array_map(__NAMESPACE__ . '\rrmdir',glob($path.'/*'))==@rmdir($path);
}

Проверено только на unix.

person d_inevitable    schedule 18.03.2012