我正在寻找一种方法来删除随机命名的文件夹中超过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";
}
?>
上面的脚本将删除uploads文件夹中超过30天的randomNamedFolders,这不是我想要的。
如何让脚本扫描uploads文件夹中所有随机命名的文件夹,并删除随机命名文件夹中30天以内的所有图像?
答案 0 :(得分:2)
$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指出的那样,即使在这种情况下只有一个条件,也总是使用大括号({}
)作为您的条件
答案 1 :(得分:0)
您必须在主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);
}
}
}
(...)
答案 2 :(得分:0)
最好的解决方案是实现递归。您可以扫描所有目录和子目录,甚至更深的目录。
<p>
<b>${listSize} </b> <br/>
<b>${printedLineCount}</b>
</p>