PHP根据文件夹删除异常文件,删除重复文件
一、图片去重控制台打印的日志
二、实现代码
<?php
namespace app\index\controller;
class Ablog extends Base
{
public function test5(){
$dir = 'H:.\.\.\imgs'; //待处理的文件所在路径
self::deletePicture($dir); //删除异常文件
self::replyPicture($dir); //删除重复文件
exit();
}
/**
* 图片删除
* 这个比较快:直接在浏览器执行
* @param $dir 待删除的文件路径
*/
public function deletePicture($dir){
$deleteNumber = 0;
$fileNames = scandir($dir); //获取到所有文件
foreach ($fileNames as $fileName){
$lastIndex = strpos($fileName, '.'); //元素最后一次出现的位置
if ($lastIndex != 9){ //过滤掉文件夹:根据实际情况判断
continue;
}
$fileDir = $dir . "\\" . $fileName; //文件的全路径
$fileSize = filesize($fileDir); //$fileSize为0,177居多,为异常文件,这里判断<200就行了
if ($fileSize < 200){ //自定义规则:文件字节 <200 视为异常文件,执行删除。
unlink($fileDir); //删除文件
$deleteNumber ++; //删除数量+1
}
}
echo "删除了 [ {$deleteNumber} ] 张图片"; //输出结果
}
/**
* 图片去重(md5_file计算文件md5散列)
* 这个比较慢,在控制器执行:Tp框架下命令行执行 php index.php /index/Ablog/test5
* @param $dir 待去重的文件路径
*/
public function replyPicture($dir){
set_time_limit(0); //设置永不超时
$replyNumber = 0; //记录去重的数量
$index = 0; //记录执行到第几张图片
$md5FileArray = []; //存放文件的 md5_file值
$fileNames = scandir($dir); //获取到所有文件
foreach ($fileNames as $fileName){
$lastIndex = strpos($fileName, '.'); //元素最后一次出现的位置
if ($lastIndex != 9){ //过滤掉文件夹:根据实际情况判断
continue;
}
$fileDir = $dir . "\\" . $fileName; //文件的全路径
$md5File = md5_file($fileDir); //计算文件的md5散列
if (in_array($md5File, $md5FileArray)){ //文件重复去重(删除)
unlink($fileDir); //删除文件
$replyNumber ++; //去重数量+1
echo "文件 [ {$fileName} ] 重复,已删除" . PHP_EOL;
}else{
$md5FileArray[] = $md5File;
}
$index ++; //图片偏移1位,用于查看执行到第几张了
echo "处理第 [ {$index} ] 张图片" . PHP_EOL; //控制台输出结果
}
echo "去重了 [ {$replyNumber} ] 张图片"; //控制台输出结果
}
}