В 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./.$object); трябва да бъде 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