php 压缩文件类,支持递归添加文件目录,支持空目录,支持中文路径及文件名
<?php //使用示例 $path = 'D:/aaa/bbb/aaa.txt'; $path = 'D:/aaa/bbb'; ZipClass::runZip($path); /** * php 压缩文件类,支持递归添加文件目录,支持空目录,支持中文路径及文件名 * Class ZipClass */ class ZipClass { /** * @param $path 目录或文件绝对路径 * @param string $zipname 压缩文件的路径 */ public static function runZip($path, $zipname = '') { $zipname = empty($zipname) ? $path . '.zip' : $zipname; $path = str_replace('\\', '/', $path); $zip = new \ZipArchive(); //if ($zip->open($zipname, \ZIPARCHIVE::CREATE)===true || $zip->open($zipname, \ZIPARCHIVE::OVERWRITE)===true) { if (is_file($zipname)) { //unlink($zipname); $zip->open($zipname, \ZIPARCHIVE::OVERWRITE); } else { $zip->open($zipname, \ZIPARCHIVE::CREATE); } if (is_file($path)) { $pathArr = explode('/', $path); $zip->addFile($path, end($pathArr)); } else { //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法 static::addFileToZip($path, $zip, strlen($path)); } $zip->close(); //关闭处理的zip文件 } /** * @param $path 压缩文件目录路径 * @param $zip ZipArchive的对象 * @param int $len 去除原始文件路径 */ public static function addFileToZip($path, $zip, $len = 0) { //$path = str_replace('\\', '/', $path); //打开当前文件夹由$path指定 $handler = opendir($path); while (($filename = readdir($handler)) !== false) { //文件夹文件名字为'.'和‘..',不要对他们进行操作 if ($filename != "." && $filename != "..") { if (is_dir($path . "/" . $filename)) { //添加空目录 $zip->addFromString(substr($path . "/" . $filename . '/', $len + 1), null); //如果读取的某个对象是文件夹,则递归 static::addFileToZip($path . "/" . $filename, $zip, $len); } else { $file3 = $path . "/" . $filename; $file4 = substr($file3, $len + 1); //将文件加入zip对象 $zip->addFile($path . "/" . $filename, $file4); } } } @closedir($path); } }