php壓縮文件夾最新版
本文實例為大家分享了php壓縮文件夾的具體代碼,供大家參考,具體內容如下
優(yōu)點:
1. 支持壓縮中文文件名
2. 支持子目錄遞歸壓縮
3. 同zip文件,重復壓縮會合并新增文件,覆蓋原來zip中的交集部分,不刪除目錄下消失的文件,只增不減(自己創(chuàng)建一個目錄,生成只有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'])); } } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
PHP實現動態(tài)創(chuàng)建XML文檔的方法
這篇文章主要介紹了PHP實現動態(tài)創(chuàng)建XML文檔的方法,結合實例形式分析了php針對xml格式數據的構建及文件讀寫相關操作技巧,需要的朋友可以參考下2018-03-03Search File Contents PHP 搜索目錄文本內容的代碼
這個類可以用來搜索在給定的文本目錄中的文件。它可以給定目錄遍歷遞歸查找某些文件擴展名的文件。2010-02-02PHP創(chuàng)建文件,并向文件中寫入數據,覆蓋,追加的實現代碼
這篇文章主要介紹了PHP創(chuàng)建文件,并向文件中寫入數據,覆蓋,追加的實現代碼,需要的朋友可以參考下2016-03-03