您好,登錄后才能下訂單哦!
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'])); } } }
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。