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

как в php проверить директорию на существование и удалить её?

Проверка на существование

В PHP есть два способа проверки директорий на существование. Первый заключается в использовании функции file_exists(). Принцип её работы обсуждался ранее в статье о правах доступа. Напомним, что функция принимает всего один строковой параметр — путь в файловой системе. Несмотря на то, что в названии содержится слово «file» она замечательно работает с директориями.

Второй способ связан со встроенной функцией is_dir(). Она, как и file_exists() принимает относительный или абсолютный путь расположения директории. Однако помимо проверки на существование также будет подтвержден тот факт, что по данному пути находится именно директория, а не файл. Если строка описывает место расположения жесткой или символической ссылки, is_dir() осуществит переход по ней и будет анализировать конечную точку пути. В случае успеха возвращается логическое значение true, а в случае неудачи false.

//создадим новую директорию в корне сайта для проверок
$dirName = "{$_SERVER['DOCUMENT_ROOT']}/directory";
if (!file_exists($dirName)) {
    mkdir($dirName);
}

var_dump(file_exists($dirName)); //Рузультат: bool(true)
var_dump(is_dir($dirName)); //Рузультат: bool(true)

Заметка
Функции, отвечающие за проверку директорий на существование, могут возвращать false при отсутствии прав доступа. Такие вещи не зависят от PHP-скрипта, это уровень ответственности операционной системы.

Удаление директории

Для удаления директории в PHP используется функция rmdir(). В качестве первого параметра ей необходимо передать место расположения каталога. По аналогии с вышеизложенными примерами будут возвращены логические значения true или false.

Удаление директории может показаться простой задачей. Однако в большинстве случаев это не так. Функция rmdir() работает только с пустым каталогом и возвращает false, если внутри содержится что-то ещё. В таком случае нужно использовать рекурсивное удаление.

//создадим временную директорию для демонстрации
$dirName = "{$_SERVER['DOCUMENT_ROOT']}/directory";
if (!file_exists($dirName)) {
    mkdir($dirName);
}

if (rmdir($dirName)) {
    echo 'Директория удалена успешно';

} else {
    echo 'Невозможно удалить директорию';
}

Рекурсивное удаление

Простого способа удаления заполненной директории не существует. Ниже мы приводим два примера реализации подобного механизма. Его можно сохранить в виде функции и использовать в любой части программного кода.

Первым способом удаления директории в PHP является использование рекурсивной функции. То есть функции, которая вызывает сама себя пока выполняются определенные условия. Взгляните на пример, приведенный ниже. Он довольно прост для понимания. Мы используем стандартную функцию scandir() для перебора всего содержимого каталога. Если мы натыкаемся на файл, вызываем функцию unlink(), а если на другую директорию, используем её имя для рекурсивного вызова.

//пример функции рекурсивного удаления заданной директории
function deleteDirectory($directoryName) {
    $files = array_diff(scandir($directoryName), ['.', '..']);

    foreach ($files as $file) {
        if (is_dir("$directoryName/$file")) {
            deleteDirectory("$directoryName/$file");

        } else {
            unlink("$directoryName/$file");
        }
    }

    return rmdir($directoryName);
}

Также в PHP есть два встроенных класса RecursiveDirectoryIterator и RecursiveIteratorIterator. Их можно использовать для перебора всех уровней вложенности указанной директории. Обратите внимание, при создании экземпляра класса RecursiveIteratorIterator мы используем второй параметр RecursiveIteratorIterator::CHILD_FIRST. Он заставляет проходить в цикле все файлы и каталоги, начиная от самых вложенных. Таким образом, можно обойтись без явного вызова рекурсивной функции.

//пример функции не использующей рекурсивные вызовы
function deleteDirectory($directoryName) {
    $iterator = new RecursiveDirectoryIterator($directoryName);
    $files = new RecursiveIteratorIterator(
        $iterator, RecursiveIteratorIterator::CHILD_FIRST
    );

    foreach ($files as $file) {
        if (in_array($file->getFilename(), ['..', '.'])) {
            continue;
        }

        ($file->isDir()) ? rmdir($file) : unlink($file);
    }

    rmdir($directoryName);
}

Последние публикации