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

Я ищу способ удаления изображений старше 30 дней в случайно названных папках.

У меня есть следующая структура каталогов на моем сервере:

mainDirectory (folder)
imagedeletescript.php (script)
images (folder)
uploads (folder)
randomNamedFolder (folder)
randomNamedFolder (folder)
randomNamedFolder (folder)
randomNamedFolder (folder)
etc.

Это мой imagedeletescript.php:

<?
$days = 30;
$dir = dirname ("/images/uploads");

$nofiles = 0;

if ($handle = opendir($dir)) {
while (( $file = readdir($handle)) !== false ) {
if ( $file == '.' || $file == '..' || is_dir($dir.'/'.$file) ) {
continue;
}

if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) {
$nofiles++;
unlink($dir.'/'.$file);
}
}
closedir($handle);
echo "Total files deleted: $nofiles \n";
}
?>

Сценарий выше удалит randomNamedFolders старше 30 дней в папке загрузки, и это не то, что я хочу.

Как я могу заставить скрипт сканировать все папки со случайными именами в папке загрузки и удалять все изображения старше 30 дней из папок со случайными именами?

0

Решение

Лучшим решением было бы реализовать рекурсию. Вы можете сканировать все каталоги и подкаталоги и даже более глубокие каталоги.

<?php
$days = 30,$deleted = 0;
function delete_old_files($dir) {
global $days,$deleted;
if(!is_dir($dir)){
return;
}
$files = preg_grep('/^([^.])/', scandir($dir));
foreach($files as $file) {
$path = $dir.'/'.$file;
if(is_dir($path)){
//the current file is a directory, re-scan it
delete_old_files($path);
continue;
}
if(time() - filemtime($path) > $days * 86400){
unlink($file) ? ++$deleted : null;
}
}
return $deleted;
}
//now call this function
delete_old_files("/images/uploads");
0

Другие решения

Вы можете использовать комбинацию glob() а также stat():

$days = 30;
$images = glob('/images/uploads/{*.png,*.jpg,*.bmp}', GLOB_BRACE);
foreach ($images as $image) {
$stats = stat($image);
if ($stats[9] < (time() - (86400 * $days)) {
unlink($image);
}
}

Это ищет файлы (независимо от их глубины) с расширениями .png, .jpg, или же .bmp в папке /images/uploads и проверяет, если они старше 30 дней.

Подсказка: Хотя это и не связано напрямую с вашей проблемой: как указано @ D4V1D, всегда используйте фигурные скобки ({}) для ваших условий, даже если в этой ситуации есть только одно условие.

2

Вы должны повторить свой while петля внутри главной loop, или вы можете использовать либо scandir() или же glob() в этом случае:

(...)
while (( $file = readdir($handle)) !== false ) {
if ( $file == '.' || $file == '..' || is_dir($dir.'/'.$file) ) {
continue;
}

$curDir = "$dir/$file";
foreach( scandir( $file ) as $rndFile ) {
if ( $rndFile == '.' || $rndFile == '..' || is_dir("$curDir/$rndFile") ) continue;
if ((time() - filemtime("$curDir/$rndFile")) > ($days *86400)) {
$nofiles++;
unlink($dir.'/'.$file);
}
}
}
(...)
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector