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} ] 張圖片"; //控制檯輸出結果
}
}