Rmdir: примеры (PHP)

Удаление директорий в PHP с помощью rmdir
Раздел: Работа с файловой системой
rmdir(string $directory, ?resource $context = null): bool

Функция rmdir() в PHP предназначена для удаления пустой директории. Она используется в случаях, когда требуется очистить файловую структуру или удалить временные каталоги, созданные в процессе работы скрипта.

Аргументы функции
  • directory (обязательный): Строка, указывающая путь к удаляемой директории. Может быть абсолютным или относительным.
  • context (необязательный): Ресурс контекста потока, создаваемый с помощью функции stream_context_create(). Используется для модификации поведения работы с потоком, например, при удалении директории через FTP или другие обертки.

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

Примеры использования rmdir
Простое удаление
<?php
$dir = 'test_dir';
if (rmdir($dir)) {
    echo "Директория '$dir' успешно удалена.";
} else {
    echo "Не удалось удалить директорию '$dir'.";
}
?>
Директория 'test_dir' успешно удалена.
Удаление с обработкой ошибок
<?php
$dir = 'non_empty_dir';
if (@rmdir($dir)) {
    echo "Директория удалена.";
} else {
    $error = error_get_last();
    echo "Ошибка: " . $error['message'];
}
?>
Ошибка: rmdir(non_empty_dir): Directory not empty
Похожие функции в PHP

unlink() - используется для удаления файлов. Не подходит для директорий.

mkdir() - антипод rmdir(), создает директорию.

Функции FileSystemIterator или рекурсивное удаление - в PHP нет встроенной функции для рекурсивного удаления непустых папок. Для этой задачи используется комбинация итераторов или рекурсивных функций с unlink() и rmdir(). Предпочтительнее использовать rmdir() для гарантированно пустых каталогов, а для сложных операций - писать кастомные функции или использовать сторонние библиотеки.

Типичные ошибки
Попытка удалить непустую директорию
<?php
$dir = 'dir_with_files';
if (!rmdir($dir)) {
    echo "Ошибка: Директория не пуста или нет прав.";
}
?>
Ошибка: Директория не пуста или нет прав.
Неверный путь или отсутствие директории
<?php
$dir = 'non_existent_dir';
var_dump(rmdir($dir));
?>
bool(false)
Отсутствие прав на запись в родительскую директорию
<?php
$dir = '/root/protected_dir';
if (!rmdir($dir)) {
    echo "Ошибка: Отказано в доступе.";
}
?>
Ошибка: Отказано в доступе.
Изменения в последних версиях PHP

В PHP 8.0 и PHP 8.1 для функции rmdir() не было внесено значимых изменений или новых параметров. Функция сохраняет свою стабильность и обратную совместимость. Работа с контекстом потока ($context) остается прежней.

Расширенные примеры
Удаление с использованием контекста потока
Пример php
<?php
// Пример для гипотетической обертки
$context = stream_context_create(array());
$dir = 'ftp://example.com/some_dir';
if (rmdir($dir, $context)) {
    echo "Удалено через потоковый контекст.";
}
?>
Рекурсивное удаление директории
Пример php
<?php
function rrmdir($dir) {
    if (is_dir($dir)) {
        $objects = scandir($dir);
        foreach ($objects as $object) {
            if ($object != "." && $object != "..") {
                $path = $dir . DIRECTORY_SEPARATOR . $object;
                if (is_dir($path)) {
                    rrmdir($path);
                } else {
                    unlink($path);
                }
            }
        }
        rmdir($dir);
    }
}

rrmdir('my_project_cache');
echo "Директория и её содержимое рекурсивно удалены.";
?>
Директория и её содержимое рекурсивно удалены.
Безопасное удаление временной директории после работы
Пример php
<?php
$tempDir = sys_get_temp_dir() . '/my_temp_' . uniqid();
mkdir($tempDir);
// ... работа с файлами в $tempDir ...
// Очистка
array_map('unlink', glob($tempDir . '/*'));
if (rmdir($tempDir)) {
    echo "Временная директория очищена.";
}
?>
Временная директория очищена.
Аналоги в других языках
Python (os.rmdir)
import os
try:
    os.rmdir('test_dir')
    print("Директория удалена")
except OSError as e:
    print(f"Ошибка: {e.strerror}")
Директория удалена

Аналогична PHP, удаляет только пустые директории. Для рекурсивного удаления используется shutil.rmtree().

JavaScript (Node.js - fs.rmdir)
const fs = require('fs').promises;
async function removeDir() {
    try {
        await fs.rmdir('test_dir');
        console.log('Директория удалена');
    } catch (err) {
        console.error('Ошибка:', err.message);
    }
}
removeDir();
Директория удалена

В современных версиях Node.js рекомендуется использовать fs.rm() с опцией { recursive: true } для удаления непустых папок.

Bash/Shell (rmdir)
rmdir test_dir
# Команда не выводит результат при успехе. При ошибке: rmdir: failed to remove 'test_dir': Directory not empty

Поведение аналогичное, удаляет только пустые директории.

PHP rmdir function comments

En
Rmdir Removes directory