基于昨天的内容安装完了zip扩展之后,于是着手开始写代码了。
代码是网上搬砖过来的,应为之前并没有做过这类的程序。
搬完一运行,响应success~?NO!!!发现并没有这么简单,去目录一看我的压缩文件呢?
接下来的工作就是去理解代码里函数的作用了,
先提出自己花半天时间学习得重点:
1.实例化类(基于TP5.0开发类名前面加'\')
$zip = new \ZipArchive;
2.创建压缩文件
(同时也是打开压缩文件,[\ZipArchive::CREATE] 常量的意思是如果不存在则创建)
$zip->open($zipName,\ZipArchive::CREATE);
3.将需要压缩的目录及文件添加进压缩资源中
$zip->addEmptyDir(文件夹路径);
$zip->addFile(文件路径,文件重命名[其实就是将文件指定放入哪个目录]);
4.释放资源
$zip->close();
下面就是我自己根据自己需要改出来的代买,如果你觉得对你有用就拿去吧,顺手给个赞就行:
public function zip_play(){
try{
//重复压缩,则会自动覆盖
$res = $this->zip('D:\sys.evcs.hygmgroup.com\runtime\log','D:\sys.evcs.hygmgroup.com\runtime\chargelog.zip');
if(!$res){
throw new Exception('压缩失败');
}else{
return "success";
}
}catch (Exception $e){
echo $e->getMessage();
}
}
/**
* description:主方法:生成压缩包
* @author: MY
* @param $dir_path 想要压缩的目录:如 './demo/'
* @param $zipName 压缩后的文件名:如 './folder/demo.zip'
* @return string
*/
public function zip($dir_path, $zipName)
{
$relationArr = array(
$dir_path => array(
'originName' => $dir_path,
'is_dir' => true,
'children' => array()
)
);
$this->modifiyFileName($dir_path, $relationArr[$dir_path]['children']);
$key = array_keys($relationArr);
$val = array_values($relationArr);
$zip = new \ZipArchive;
//ZIPARCHIVE::CREATE没有即是创建
$zip->open($zipName,\ZipArchive::CREATE);
$this->zipDir($key[0], '', $zip, $val[0]['children']);
$zip->close();
return true;
}
/**
* [zipDir 给zip文件添加目录及文件]
* @param [type] $real_path [根目录]
* @param [type] $zip_path [压缩目录]
* @param [type] &$zip [引入zip资源]
* @param [type] $relationArr [参数变量]
* @return [type] [description]
*/
function zipDir($real_path, $zip_path, &$zip, $relationArr)
{
$sub_zip_path = empty($zip_path) ? '' : $zip_path . '/';
if (is_dir($real_path)) {
foreach ($relationArr as $k => $v) {
if ($v['is_dir']) { //是文件夹
$zip->addEmptyDir($sub_zip_path . $v['originName']);
$this->zipDir($real_path . '/' . $k, $sub_zip_path . $v['originName'], $zip, $v['children']);
} else { //不是文件夹
$zip->addFile($real_path . '/' . $k, $sub_zip_path . $k);
}
}
}
}
/**
* [modifiyFileName 遍历目录下所有文件夹及文件]
* @param [type] $path [需要压缩的目录路径]
* @param [type] &$relationArr [引入参数变量]
* @return [type] [无]
*/
function modifiyFileName($path, &$relationArr){
if (!is_dir($path) || !is_array($relationArr)) {
return false;
}
if ($dh = opendir($path)) {
$count = 0;
while (($file = readdir($dh)) !== false) {
if(in_array($file,array('.', '..', null))) continue; //无效文件,重来
if (is_dir($path . '/' . $file)) {
$relationArr[$file] = array(
'originName' => iconv('GBK', 'UTF-8', $file),
'is_dir' => true,
'children' => array()
);
$this->modifiyFileName($path . '/' . $file, $relationArr[$file]['children']);
}else{
$relationArr[$file] = array(
'originName' => iconv('GBK', 'UTF-8', $file),
'is_dir' => false,
'children' => array()
);
}
}
}
}