Функция 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 для управления временными данными, такими как кеш.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 22.01.2025 14:15
- Последнее обновление: 22.01.2025 14:24