./comments
./contacts telegram: @stikname
email: ;

Рекурсивное удаление каталога или удаление папки с файлами на PHP

PHP
При написании своей цмс столкнулся с тем что какие либо временные данные, а именно кэш модулей нужно удалять периодически, но из-за того что весь кэш у меня сортируется по папкам и подпапкам с файлами. То простыми функциями unlink и rmdir тут не обойтись. Пришлось искать варианты и лепить из них рекурсивную функцию удаления каталогов с файлами, что бы одним запросом вычищать всю папку временных файлов цмс.

Вот что у нас получилось, собственно сама функция:
function fullRemove_ff($path,$t="1") {
$rtrn="1";
if (file_exists($path) && is_dir($path)) {
$dirHandle = opendir($path);
while (false !== ($file = readdir($dirHandle))) {
if ($file!='.' && $file!='..') {
$tmpPath=$path.'/'.$file;
chmod($tmpPath, 0777);
if (is_dir($tmpPath)) {
fullRemove_ff($tmpPath);
} else {
if (file_exists($tmpPath)) {
unlink($tmpPath);
}
}
}
}
closedir($dirHandle);
if ($t=="1") {
if (file_exists($path)) {
rmdir($path);
}
}
} else {
$rtrn="0";
}
return $rtrn;
}


При проверке на существование каталогов и файлов, перед их удалением скрипт выставляет им права 777, на тот случай если до этого были выставлены права при которых удалить файл или папку не удалось бы.

Пример удаления указанной папки со всем содержимым:
fullRemove_ff($_SERVER['DOCUMENT_ROOT']."/tmp_files/",1);


Пример удаления только содержимого указанной папки, сама папка не удаляется:
fullRemove_ff($_SERVER['DOCUMENT_ROOT']."/tmp_files/");


Для справки:
* $_SERVER['DOCUMENT_ROOT'] - корневая директория сайта.
29.01.2013 11:21:50
admin
4365
5
Комментарии

Стас
26.10.2014 22:11:32
А что за функция RemoveDir($tmpPath); ???
admin
26.10.2014 23:24:02
Спасибо, что заметил. Исправил.
Сергей
29.10.2014 23:59:21
Спасибо, как раз то что нужно! Разные варианты пробовал из тех что выкладывали в интернете, ничего не работало, твой пример работает! Не подскажешь как сделать чтобы функция удаления срабатывала, если в папке которую нужно удалить набралось 20 000 файлов. Т.е. файл будет запускаться по крону, сканирует её, и если количество файлов более 20 тыс. очищает папку.
Сергей
30.10.2014 03:59:20
Уже сам нашел решение с подсчетом файлов.
Дмитрий
25.02.2015 15:33:44
Эти примеры удалят исходную папку в любом случае.
Если нужно оставить папку, то запускать функцию fullRemove_ff($_SERVER['DOCUMENT_ROOT']."/tmp_files/", 0);
К тому же, слэш вконце адреса лишний, вы же сами его добавляете в 7 строке, так что совсем правильнее fullRemove_ff($_SERVER['DOCUMENT_ROOT']."/tmp_files", 0);