本文實例為大家分享了php壓縮文件夾的具體代碼,供大家參考,具體內容如下
優點:
1. 支持壓縮中文文件名
2. 支持子目錄遞歸壓縮
3. 同zip文件,重復壓縮會合并新增文件,覆蓋原來zip中的交集部分,不刪除目錄下消失的文件,只增不減(自己創建一個目錄,生成只有A和B文件的test.zip,然后增加C文件在目錄,再壓縮成同名test.zip,那么zip里面會有ABC三個文件;如果目錄刪除其他文件,僅保留A文件,生成test.zip不會有改變,里面還是有ABC)
缺點:
1. 單個文件不能壓縮 (todo)
2. 文件夾下,不能僅挑選數個文件進行壓縮(todo)
/** * 總接口 * @param $dir_path 需要壓縮的目錄地址(絕對路徑) * @param $zipName 需要生成的zip文件名(絕對路徑) */function zip($dir_path,$zipName){ $relationArr = [$dir_path=>[ 'originName'=>$dir_path, 'is_dir' => true, 'children'=>[] ]]; modifiyFileName($dir_path,$relationArr[$dir_path]['children']); $zip = new ZipArchive(); $zip->open($zipName,ZipArchive::CREATE); zipDir(array_keys($relationArr)[0],'',$zip,array_values($relationArr)[0]['children']); $zip->close(); restoreFileName(array_keys($relationArr)[0],array_values($relationArr)[0]['children']);}/** * 遞歸添加文件進入zip * @param $real_path 在需要壓縮的本地的目錄 * @param $zip_path zip里面的相對目錄 * @param $zip ZipArchive對象 * @param $relationArr 目錄的命名關系 */function zipDir($real_path,$zip_path,&$zip,$relationArr){ $sub_zip_path = empty($zip_path)?'':$zip_path.'//'; if (is_dir($real_path)){ foreach($relationArr as $k=>$v){ if($v['is_dir']){ //是文件夾 $zip->addEmptyDir($sub_zip_path.$v['originName']); zipDir($real_path.'//'.$k,$sub_zip_path.$v['originName'],$zip,$v['children']); }else{ //不是文件夾 $zip->addFile($real_path.'//'.$k,$sub_zip_path.$k); $zip->deleteName($sub_zip_path.$v['originName']); $zip->renameName($sub_zip_path.$k,$sub_zip_path.$v['originName']); } } }}/** * 遞歸將目錄的文件名更改為隨機不重復編號,然后保存原名和編號關系 * @param $path 本地目錄地址 * @param $relationArr 關系數組 * @return bool */function modifiyFileName($path,&$relationArr){ if(!is_dir($path) || !is_array($relationArr)){ return false; } if($dh = opendir($path)){ $count = 0; while (($file = readdir($dh)) !== false){ if(in_array($file,['.','..',null])) continue; //無效文件,重來 if(is_dir($path.'//'.$file)){ $newName = md5(rand(0,99999).rand(0,99999).rand(0,99999).microtime().'dir'.$count); $relationArr[$newName] = [ 'originName' => iconv('GBK','UTF-8',$file), 'is_dir' => true, 'children' => [] ]; rename($path.'//'.$file, $path.'//'.$newName); modifiyFileName($path.'//'.$newName,$relationArr[$newName]['children']); $count++; } else{ $extension = strchr($file,'.'); $newName = md5(rand(0,99999).rand(0,99999).rand(0,99999).microtime().'file'.$count); $relationArr[$newName.$extension] = [ 'originName' => iconv('GBK','UTF-8',$file), 'is_dir' => false, 'children' => [] ]; rename($path.'//'.$file, $path.'//'.$newName.$extension); $count++; } } }}/** * 根據關系數組,將本地目錄的文件名稱還原成原文件名 * @param $path 本地目錄地址 * @param $relationArr 關系數組 */function restoreFileName($path,$relationArr){ foreach($relationArr as $k=>$v){ if(!empty($v['children'])){ restoreFileName($path.'//'.$k,$v['children']); rename($path.'//'.$k,iconv('UTF-8','GBK',$path.'//'.$v['originName'])); }else{ rename($path.'//'.$k,iconv('UTF-8','GBK',$path.'//'.$v['originName'])); } }}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。
新聞熱點
疑難解答
圖片精選