php获取压缩文件列表,php获取所有文件并压缩

/*

* 压缩文件

* */

function zip($files){

$zipName = 'download.zip';

$zip = new \ZipArchive;//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释

/*

* 通过ZipArchive的对象处理zip文件

* $zip->open这个方法如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE

* $zip->open这个方法第一个参数表示处理的zip文件名。

* 这里重点说下第二个参数,它表示处理模式

* ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。

* ZIPARCHIVE::CREATE 如果不存在则创建一个zip压缩包,若存在系统就会往原来的zip文件里添加内容。

*

* 这里不得不说一个大坑。

* 我的应用场景是需要每次都是创建一个新的压缩包,如果之前存在,则直接覆盖,不要追加

* so,根据官方文档和参考其他代码,$zip->open的第二个参数我应该用 ZipArchive::OVERWRITE

* 问题来了,当这个压缩包不存在的时候,会报错:ZipArchive::addFile(): Invalid or uninitialized Zip object

* 也就是说,通过我的测试发现,ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效

* 所以我的解决方案是 $zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)

*

* 以上总结基于我当前的运行环境来说

* */

if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE) {

exit('无法打开文件,或者文件创建失败');

}

foreach($files as $val){

//$attachfile = $attachmentDir . $val['filepath']; //获取原始文件路径

if(file_exists($val)){

//addFile函数首个参数如果带有路径,则压缩的文件里包含的是带有路径的文件压缩

//若不希望带有路径,则需要该函数的第二个参数

$zip->addFile($val, basename($val));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下

}

}

$zip->close();//关闭

if(!file_exists($zipName)){

exit("无法找到文件"); //即使创建,仍有可能失败

}

return '打包成功';

}

/*

* 获取文件的路径及名称

* */

function traverse($path)

{

global $filePath;//得到外部定义的数组

$current_dir = opendir($path); //opendir()返回一个目录句柄,失败返回false

while (($file = readdir($current_dir)) !== false) { //readdir()返回打开目录句柄中的一个条目

$sub_dir = $path . DIRECTORY_SEPARATOR . $file; //构建子目录路径

if ($file == '.' || $file == '..') {

continue;

} else if (is_dir($sub_dir)) { //如果是目录,进行递归

traverse($sub_dir); //嵌套遍历子文件夹

} else { //如果是文件,直接输出路径和文件名

$filePath[$path . '/' . $file] = $path . '/' . $file;//把文件路径赋值给数组

}

}

return $filePath;

}

1b0f9aabfb34d087464c9951b8ff01cd.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值