Функция cot_rmdir в Cotonti

Функция cot_rmdir предназначена для удаления каталога вместе со всем его содержимым. Она работает рекурсивно, удаляя файлы и подкаталоги внутри указанной директории. Давайте разберем её работу по шагам.

/**
 * Removes a directory recursively
 * @param string $dir Directory path
 * @return int Number of files and folders removed
 */
function cot_rmdir($dir)
{
    if(empty($dir) && $dir != '0') return false;

    static $cnt = 0;

    if (is_dir($dir)) {
        $objects = scandir($dir);
        foreach ($objects as $f) {
            $path = $dir . DIRECTORY_SEPARATOR . $f;
            if ($f != "." && $f != "..")
            {
                if (filetype($path) == "dir")
                {
                    cot_rmdir($path);
                }
                else
                {
                    unlink($path);
                    $cnt++;
                }
            }
        }
        reset($objects);
        rmdir($dir);
        $cnt++;
    }

    return $cnt;
}

Аргументы функции:

$dir: Путь к директории, которую нужно удалить.
Возвращаемое значение:
Функция возвращает количество удаленных файлов и папок (включая саму директорию).


Логика работы функции:

1. Проверка входных данных:

if (empty($dir) && $dir != '0') return false;


Если путь к директории пустой или равен null, функция немедленно завершает работу, возвращая false. Это предотвращает случайное удаление корневого каталога или других критически важных данных.

2. Инициализация счетчика:

static $cnt = 0;


Используется статическая переменная $cnt, чтобы отслеживать общее количество удаленных объектов (файлов и папок). Статическая переменная сохраняет свое значение между вызовами функции, даже в случае рекурсии.

3. Проверка, является ли путь директорией:

if (is_dir($dir)) {


Если путь указывает на директорию, начинается её обработка. Если это не директория (например, файл), функция ничего не делает.

4. Сканирование содержимого директории:

$objects = scandir($dir);


Функция scandir возвращает массив с именами всех объектов в директории, включая служебные записи "." (текущая директория) и ".." (родительская директория).

5. Итерация по объектам:

foreach ($objects as $f) {
    $path = $dir . DIRECTORY_SEPARATOR . $f;
    if ($f != "." && $f != "..") {

    
Каждый объект внутри директории обрабатывается по отдельности. Служебные записи "." и ".." пропускаются.

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

if (filetype($path) == "dir") {
    cot_rmdir($path);
}


Если текущий объект — подкаталог, функция вызывает сама себя (cot_rmdir) для рекурсивного удаления содержимого этой директории.

7. Удаление файлов:

else {
    unlink($path);
    $cnt++;
}


Если объект — файл, он удаляется с помощью unlink, а счетчик $cnt увеличивается.

8. Удаление текущей директории:
 

reset($objects);
rmdir($dir);
$cnt++;


После удаления всех файлов и подкаталогов текущая директория очищается (удаляется) с помощью rmdir. Счетчик снова увеличивается.

9. Возврат результата:
 
 

return $cnt;

После завершения работы функция возвращает общее количество удаленных объектов.
Пример использования:
 

$dir = '/path/to/directory';
$deletedItems = cot_rmdir($dir);

if ($deletedItems !== false) {
    echo "Удалено объектов: $deletedItems";
} else {
    echo "Не удалось удалить директорию.";
}


Особенности и назначение:

Удаление содержимого и самой директории:

Функция подходит для безопасного удаления директорий вместе со всеми файлами и подкаталогами.

Рекурсивная структура:

Используется рекурсия для обработки вложенных подкаталогов.

Счетчик удалений:

Функция подсчитывает количество удаленных объектов, что полезно для отчета или логирования.

Предотвращение ошибок:

Пропуск пустого или некорректного пути (empty($dir)).
Игнорирование служебных записей (".", "..").
Потенциальные улучшения:
Добавить проверку на права доступа перед удалением.
Обрабатывать ошибки (unlink или rmdir могут не сработать из-за прав или блокировки файлов).
Убрать использование статической переменной $cnt для лучшей изоляции функции (например, передавать счетчик через аргумент).

 

 

Давайте разберем пример применения функции cot_rmdir в Cotonti:

if (file_exists($cfg['cache_dir'] . '/htmlpurifier'))
{
    cot_rmdir($cfg['cache_dir'] . '/htmlpurifier');
}

 
 

Назначение кода:

Этот код проверяет наличие каталога htmlpurifier в директории кеша (путь определяется как $cfg['cache_dir'] . '/htmlpurifier'). Если каталог существует, он удаляется вместе со всем своим содержимым с помощью функции cot_rmdir.

Разбор кода по шагам:

Проверка существования каталога:

 
 

if (file_exists($cfg['cache_dir'] . '/htmlpurifier'))


Условие file_exists проверяет, существует ли файл или директория по указанному пути.
Если путь существует, код переходит к следующему шагу. Если нет, то функция cot_rmdir не вызывается.

Вызов cot_rmdir для удаления каталога:
 
 

cot_rmdir($cfg['cache_dir'] . '/htmlpurifier');


Функция удаляет указанный каталог htmlpurifier и все его содержимое (файлы, подкаталоги).

Если каталог пустой, он просто удаляется.

Результат удаления (количество удаленных файлов и папок) не используется в данном контексте.

Конкретное использование в Cotonti:

Контекст:

В данном случае речь идет о каталоге htmlpurifier, который, скорее всего, используется для хранения кеша, созданного библиотекой HTML Purifier (обычно применяется для фильтрации и очистки HTML-кода).
Удаление каталога кеша может потребоваться при обновлении, очистке или сбросе кеша сайта.


Зачем это нужно:

Если структура кеша htmlpurifier повреждена или устарела, её удаление позволяет системе автоматически создать новый кеш при следующем использовании библиотеки.


Пример:
Допустим, каталог кеша для htmlpurifier находится в /var/www/site/cache/htmlpurifier. При выполнении приведенного кода:

Проверяется, существует ли каталог /var/www/site/cache/htmlpurifier.

Если он существует, вызывается cot_rmdir, чтобы удалить этот каталог и всё его содержимое.

Возможные улучшения:

Логирование процесса удаления:

Можно добавить запись в лог, чтобы фиксировать успешное или неуспешное удаление каталога:
 
 

if (file_exists($cfg['cache_dir'] . '/htmlpurifier'))
{
    if (cot_rmdir($cfg['cache_dir'] . '/htmlpurifier'))
    {
        cot_log("Удален кеш HTML Purifier", 'cache', 'cleanup');
    }
    else
    {
        cot_log("Не удалось удалить кеш HTML Purifier", 'cache', 'error');
    }
}


Проверка прав доступа:

Перед вызовом cot_rmdir можно убедиться, что у скрипта есть права на удаление:
 
 

if (is_writable($cfg['cache_dir'] . '/htmlpurifier'))
{
    cot_rmdir($cfg['cache_dir'] . '/htmlpurifier');
}


Использование результата:

Функция cot_rmdir возвращает количество удаленных объектов. Это значение можно использовать для информирования пользователя или в логах:
 

 
$deletedItems = cot_rmdir($cfg['cache_dir'] . '/htmlpurifier');
echo "Удалено $deletedItems объектов.";


Этот пример показывает типичное применение функции cot_rmdir в системе Cotonti для управления временными данными, такими как кеш.

 

5 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 22.01.2025 14:15
  • Последнее обновление: 22.01.2025 14:24