W3docs

rmdir()

Функция rmdir() в PHP используется для удаления директории. Узнайте её синтаксис, параметры и примеры использования.

Введение

В PHP функция rmdir() используется для удаления директории. Это полезная функция для управления файловой системой. В этой статье мы рассмотрим всё, что нужно знать о функции rmdir(): её синтаксис, параметры и примеры использования.

Понимание функции rmdir()

Функция rmdir() удаляет директорию из файловой системы. Важно помнить одно правило: rmdir() удаляет только пустые директории. Если директория всё ещё содержит файлы или поддиректории, вызов завершится ошибкой, и PHP выдаст предупреждение E_WARNING.

Это сделано намеренно — чтобы защитить от случайного удаления целого дерева файлов одним неверным вызовом. Для удаления директории с содержимым необходимо сначала очистить её (см. Пример 2 ниже).

Другие ситуации, при которых rmdir() завершается неудачей и возвращает false:

  • Указанный путь не существует или является файлом, а не директорией.
  • У пользователя скрипта нет прав на запись и выполнение в родительской директории.
  • На некоторых системах директория является текущей рабочей директорией процесса или используется иным образом.

Связанные функции, которые часто используются вместе с rmdir(): mkdir() — для создания директорий, is_dir() — для проверки того, является ли путь директорией, scandir() — для получения списка содержимого, и unlink() — для удаления отдельных файлов внутри директории.

Синтаксис функции rmdir()

rmdir(string $directory, ?resource $context = null): bool
ПараметрОписание
$directoryОбязательный. Путь к удаляемой директории.
$contextНеобязательный. Ресурс контекста потока, используется главным образом с пользовательскими обёртками потоков. Редко требуется для локальных файлов.

Функция возвращает true в случае успеха и false в случае ошибки.

Примечание о кэшировании: PHP кэширует результаты проверок состояния файлов. После создания или удаления директорий в цикле вызывайте clearstatcache() перед повторной проверкой того же пути с помощью is_dir() или file_exists(), иначе вы можете получить устаревший результат.

Примеры использования rmdir()

Пример 1: Удаление директории

В этом примере перед попыткой удаления проверяется существование пути с помощью is_dir(), и выводится сообщение об успехе или неудаче:

<?php

$directory = 'example_directory';

if (is_dir($directory)) {
    if (rmdir($directory)) {
        echo "Directory removed successfully.";
    } else {
        echo "Failed to remove directory. It may not be empty or lack permissions.";
    }
} else {
    echo "Directory does not exist.";
}

Если example_directory существует и пуста, будет выведено Directory removed successfully. Проверка с помощью is_dir() позволяет избежать предупреждения, которое rmdir() иначе выдала бы для несуществующего пути.

Пример 2: Удаление непустой директории

Поскольку rmdir() отказывается удалять директорию, содержащую файлы, необходимо сначала очистить её. Стандартное решение — рекурсивная вспомогательная функция, которая обходит дерево, удаляет каждый файл с помощью unlink() и рекурсивно обрабатывает каждую поддиректорию, прежде чем вызвать rmdir() на теперь уже пустой директории:

<?php

function removeDirectory($dir) {
    if (!is_dir($dir)) {
        return false;
    }
    $files = array_diff(scandir($dir), ['.', '..']);
    foreach ($files as $file) {
        $path = $dir . DIRECTORY_SEPARATOR . $file;
        is_dir($path) ? removeDirectory($path) : unlink($path);
    }
    return rmdir($dir);
}

removeDirectory('example_directory');

Здесь array_diff(scandir($dir), ['.', '..']) исключает специальные записи . и .., возвращаемые scandir(), а DIRECTORY_SEPARATOR строит пути, работающие как в Windows, так и в Unix-подобных системах. Функция возвращает результат финального вызова rmdir(), поэтому вы можете проверить его успешность.

Совет: Рекурсивное удаление — деструктивная операция без возможности отмены. Перед вызовом проверяйте путь (например, отклоняйте пустую строку или корень файловой системы), чтобы ошибка не уничтожила больше, чем предполагалось.

Распространённые ошибки и подводные камни

  • Попытка удалить непустую директорию. Это наиболее частая причина неудачи. Сначала очистите директорию или воспользуйтесь рекурсивной вспомогательной функцией выше.
  • Игнорирование возвращаемого значения. rmdir() возвращает false, а не выбрасывает исключение при большинстве ошибок (она выдаёт предупреждение). Всегда проверяйте булев результат в важном коде.
  • Подавление предупреждения с помощью @. @rmdir($dir) скрывает сообщение, но не саму ошибку. Лучше проверяйте is_dir() и возвращаемое значение.
  • Забывание о правах доступа. Для удаления директории требуются права на запись и выполнение в её родительской директории, а не в самой удаляемой директории.

Заключение

Функция rmdir() предоставляет простой способ удаления пустых директорий в PHP. Для удаления директории с содержимым необходимо сначала очистить её — как правило, с помощью рекурсивной вспомогательной функции, объединяющей scandir() и unlink(). Всегда проверяйте возвращаемое значение и защищайте деструктивные рекурсивные удаления проверкой пути.

Для дальнейшего изучения ознакомьтесь со связанными функциями для работы с директориями: mkdir(), is_dir(), scandir() и rename().

Практика

Практика
Какова цель функции rmdir() в PHP?
Какова цель функции rmdir() в PHP?
Was this page helpful?