压缩
ZipArchive::open第二个参数说明:
ZipArchive::OVERWRITE
总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。ZipArchive::CREATE
如果不存在则创建一个zip压缩包。ZipArchive::EXCL
如果压缩包已经存在,则出错。ZipArchive::CHECKCONS
对压缩包执行额外的一致性检查,如果失败则显示错误。
压缩单个文件
$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::OVERWRITE);
if($flag!==true){
echo "open error code: {$flag}\n";
exit();
}
$zip->addFile('C:/1.txt', '1.txt'); //zip文件中的文件名为1.txt,如果忽略,则会多一个名为C:的文件夹
$flag = $zip->close();
echo $flag?'success':'fail';
压缩多个文件
$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::OVERWRITE);
if($flag!==true){
echo "open error code: {$flag}\n";
exit();
}
$zip->addFile('C:/1.txt', '1.txt');
$zip->addFile('C:/2.txt', '2.txt');
$flag = $zip->close();
echo $flag?'success':'fail';
添加文件到压缩包
如果存在压缩包,则添加;若不存在,则新建
$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::CREATE);
if($flag!==true){
echo "open error code: {$flag}\n";
exit();
}
$zip->addFile('C:/2.txt', 'folder/2.txt');
$flag = $zip->close();
echo $flag?'success':'fail';
压缩文件夹
/**
* @param string $basePath 带/结尾
* @param string $relativePath 不带/开头
* @param ZipArchive $zip
*/
function zipFolder($basePath, $relativePath, ZipArchive $zip)
{
$handler = opendir($basePath.$relativePath); //打开当前文件夹
while(($filename = readdir($handler))!==false){
if($filename!='.' && $filename!='..'){
if(is_dir($basePath.$relativePath.'/'.$filename))
zipFolder($basePath, $relativePath.'/'.$filename, $zip);
else
$zip->addFile($basePath.$relativePath.'/'.$filename, $relativePath.'/'.$filename);
}
}
closedir($handler);
}
$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::OVERWRITE);
if($flag!==true){
echo "open error code: {$flag}\n";
exit();
}
zipFolder('C:/', 'test', $zip); //压缩文件夹C:/test,并且压缩包以test文件夹开始
$flag = $zip->close();
echo $flag?'success':'fail';
该程序有一个问题,如果包含一个空的子文件夹,则会被忽略,如果需要可以通过$zip->addEmptyDir('folder');
补充
添加其它类型文件
addEmptyDir
, addFromString
$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::OVERWRITE);
if($flag!==true){
echo "open error code: {$flag}\n";
exit();
}
$zip->addFile('C:/1.txt', '1.txt');
$zip->addEmptyDir('folder1'); //添加一个空文件夹
$zip->addFromString('string.txt', 'hello everyone, my name is ...'); //添加字符串文件
$flag = $zip->close();
echo $flag?'success':'fail';
addGlob
$zip = new ZipArchive();
$flag = $zip->open('C:/out.zip', ZipArchive::OVERWRITE);
if($flag!==true){
echo "open error code: {$flag}\n";
exit();
}
$options = ['add_path'=>'ttt/', 'remove_all_path'=>true]; //移除所有路径,并将路径设置为ttt
//添加符合通配符规则的文件
$zip->addGlob('C:/test/*.txt',0, $options);
$flag = $zip->close();
echo $flag?'success':'fail';
解压
解压整个文件
解压文件到文件夹C:/out/中
$zip = new ZipArchive();
$flag = $zip->open('C:/in.zip');
if($flag!==true){
echo "open error code: {$flag}\n";
exit();
}
$zip->extractTo('C:/out/');
$flag = $zip->close();
echo $flag?'success':'fail';
注意:该程序不支持中文
支持中文的解压缩
$zip = new ZipArchive();
$zipFilePath = 'C:/in.zip';
$flag = $zip->open($zipFilePath);
if($flag!==true){
echo "open error code: {$flag}\n";
exit();
}
$outDir = "C:/out/";
for($i=0;$i<$zip->numFiles;$i++){
$statInfo = $zip->statIndex($i);
// print_r($statInfo);
if(substr($statInfo['name'], strlen($statInfo['name'])-1)=='/'){
mkdir($outDir.substr($statInfo['name'], 0, -1));
}
else{
copy('zip://'.$zipFilePath.'#'.$statInfo['name'], $outDir.'/'.$statInfo['name']);
}
}
$flag = $zip->close();
echo $flag?'success':'fail';
提取压缩包中指定的文件
使用上述例子中的$statInfo = $zip->statIndex($i);
获得的$statInfo['name']
进行过滤。
读取信息
$zip = new ZipArchive();
$zipFilePath = 'C:/in.zip';
$flag = $zip->open($zipFilePath);
if($flag!==true){
echo "open error code: {$flag}\n";
exit();
}
$outDir = "C:/out/";
for($i=0;$i<$zip->numFiles;$i++){
$statInfo = $zip->statIndex($i);
print_r($statInfo);
}
$flag = $zip->close();
echo $flag?'success':'fail';
备注
ZipArchive::open返回值
如果打开成功则返回true,否则返回错误码,一下错误码表。
ZipArchive::ER_EXISTS
文件已存在ZipArchive::ER_INCONS
zip archive前后不一致ZipArchive::ER_INVAL
参数不合法ZipArchive::ER_MEMORY
malloc失败ZipArchive::ER_NOENT
没有这个文件ZipArchive::ER_NOZIP
不是一个zip archiveZipArchive::ER_OPEN
无法打开文件ZipArchive::ER_READ
读取失败ZipArchive::ER_SEEK
seek失败