PHP删除未知子目录中的图像

时间:2016-02-02 15:10:12

标签: php delete-file directory

我正在寻找一种方法来删除随机命名的文件夹中超过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天以内的所有图像?

3 个答案:

答案 0 :(得分:2)

您可以使用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指出的那样,即使在这种情况下只有一个条件,也总是使用大括号({})作为您的条件

答案 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>