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);
}
}