压缩整个文件
代码如下(示例):
$zip = new \ZipArchive();
$filename = 'xxx.zip';//压缩文件名,自己命名
if($zip->open($filename, \ZIPARCHIVE::CREATE)!==TRUE){
exit('cannot open ' . $filename .'\n');
}
$this->zipFolder('D:/','xxx', $zip); //被压缩文件路径 例子压缩路径为:D:/xxx
$zip->close();
//压缩整个文件夹以及过滤
public function zipFolder($basePath,$relativePath,$zip)
{
$handler = opendir($basePath.$relativePath); //打开当前文件夹
while(($filename = readdir($handler))!==false){ //readdir() 函数返回目录中下一个文件的文件名
if($filename != '.' && $filename != '..'){ //若文件为目录,则递归调用函数
if(is_dir($basePath . $relativePath. '/' . $filename)){
$this->zipFolder($basePath, $relativePath. '/' . $filename, $zip);
}else{
$zip->addFile($basePath . $relativePath. '/' .$filename, $relativePath. '/' . $filename);
}
}
}
closedir($handler);
}
过滤指定文件
若要过滤指定文件夹则移除该目录;若需过滤某一文件夹下的部分文件,则在将文件加入压缩文件时,判断其上级目录是否为该文件目录名,再判断是否为需要过滤的文件名。
$zip = new \ZipArchive();
$filename = 'xxx.zip';//压缩文件名,自己命名
if($zip->open($filename, \ZIPARCHIVE::CREATE)!==TRUE){
exit('cannot open ' . $filename .'\n');
}
$this->zipFolder('D:/','xxx', $zip); //被压缩文件路径 例子压缩路径为:D:/xxx
$zip->close();
//压缩整个文件夹以及过滤
public function zipFolder($basePath,$relativePath,$zip)
{
$handler = opendir($basePath.$relativePath); //打开当前文件夹
while(($filename = readdir($handler))!==false){ //readdir() 函数返回目录中下一个文件的文件名
if($filename!='.' && $filename!='..' && $filename!='目录名'){ //移除指定的目录
if(is_dir($basePath . $relativePath . '/' . $filename)){ //若文件为目录,则递归调用函数
$this->zipFolder($basePath, $relativePath . '/' .$filename, $zip);
}else{
if($relativePath == 'yyy'){ //过滤D:/xxx/yyy目录下的a.php,b.php文件
if(!in_array($filename,['a.php','b.php'])){
$zip->addFile($basePath . $relativePath . '/' . $filename, $relativePath . '/' . $filename); // 加入压缩文件
}
}else{
$zip->addFile($basePath . $relativePath . '/' . $filename, $relativePath . '/' . $filename);
}
}
}
}
closedir($handler);
}