Быстрый способ удаления папки на PHP

В РНР для удаления файла существует функция unlink(), для удаления пустого каталога - rmdir(). Что делать если нужно рекурсивно удалить папку со всеми файлами и подкаталогами. На помощь приходит glob() в связке с array_map().

Заметьте, что в функции нет ни единого цикла.


function removeDir($path) {
    if (is_file($path)) {
    	@unlink($path);
    } else {
        array_map('removeDir',glob('/*')) == @rmdir($path);
    }
    @rmdir($path);
}

Пример вызова


$path = $_SERVER['DOCUMENT_ROOT'].'/test';
removeDir($path);

Для вставки кода используйте HTML-теги
<pre><code class="php">ваш код</code></pre>

  • Denis Kompaneets

    серврере ложится надо что-то полегче


    Service Temporarily Unavailable
    The server closed the connection without sending any data.
    The server is temporarily unable to service your request due to maintenance downtime or capacity problems.
    Due to heavy load on the server, connections may be temporarily blocked from locations that fetch an unusually high number of pages.
    We apologize for the inconvenience.

  • Спасибо, пригодилось

  • Вообще чувак cPanel дописывает, такой фигни не заметил =) гы.

  • в стоке 2 не хватает скобки
    if (is_file($path) {
    вот и ошибка

  • Понятно

  • Илья

    Ну он пишет «неожиданный ‘{‘ на N строке» и тоже самое с @

  • Илья

    А можете объяснить нубу почему эта функция у меня ругается на фигурные скобки в условии, а если их удалить, то начинает ругаться на собаку?

    • Текст ошибки в студию!

      • Илья

        А, да всё… Я решил проблему — не использую этот скрипт. Всё равно там же используется скрипт создания субдомена через cPanel. Я его немного дописал и он ещё и папки теперь удаляет.

  • Вы не правы насчет не используются цикла как рас используются вы применяется callback функцию что рекурсивно вызывается на каждое значение массива

    • Визуально в коде нет ни одного цикла. Код читается проще. О внутреннем устройстве функций РНР речи не идет.

  • А если removeDir в классе определять? Как указывать первый параметр array_map?

  • Да, вы правы — так будет лучше. Поправил в статье.

  • Спасибо за идею, но у меня эта функция не сработала так, как хотелось бы. Я немного подкорректировал функцию и вызов. Теперь она удаляет указанную папку со всеми подпапками и файлами:

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

    // Пример вызова
    $path = $_SERVER['DOCUMENT_ROOT'].'/test';
    removeDir($path);

    • Сергей

      Не работает. Не удаляет самую верхнюю директорию. Вот рабочий пример
      function removeDirectory($dir) {
      if ($objs = glob($dir.»/*»)) {
      foreach($objs as $obj) {
      is_dir($obj) ? removeDirectory($obj) : unlink($obj);
      }
      }
      rmdir($dir);
      }