一开始使用php调用命令行来执行压缩,后来发现php有ZipArchive类库实现了文件的压缩与解压缩
//递归移动文件到当前目录
public function moveZipFiles($path,$aimpath) //把path里的所有文件夹里的文件都移动到path层
{
//rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");
$handler = opendir($path);
while (($filename = readdir($handler)) !== false)
{
if($filename != "." && $filename != "..") //务必使用!==,防止目录下出现类似文件名“0”等情况
{
if(is_dir($path.'/'.$filename)) //如果是目录,递归移动
{
$this->moveZipFiles($path.'/'.$filename,$aimpath); //yii的php递归需要加上$this
}
else //如果是文件,则移动到aimpath
{
rename($path.'/'.$filename, $aimpath.'/'.$filename);
}
}
}
closedir($handler);
}
//解压上传的bin文件的压缩包
public function unZip($zipPath,$path)
{
$f =new func();
$zip = new ZipArchive;
if($zip->open($zipPath)===TRUE){
$zip->extractTo($path);//假设解压缩到在当前路径下images文件夹内
$zip->close();//关闭处理的zip文件
}
//解压缩完毕删除压缩包
unlink($zipPath);
$f->moveZipFiles($path,$path);
}
方法moveZipFiles是递归的把解压文件夹里面的文件都移动到最外层的目录下,unZip实现了解压,移动,并删除压缩包的功能,其两个参数是压缩包路径和解压路径,一个是文件,一个为目录
而压缩文件,ZipArchive也提供了足够的简单的接口
public function generateTaskZip($prj_id , $ver_id , $task_id )
{
$f = new func();
$zip = new ZipArchive;
$task_dir = Yii::getPathOfAlias('webroot').'/projects/'.$prj_id .'/'.$ver_id .'/'.$task_id ;
$root_dir = Yii::getPathOfAlias('webroot');
$generatefile_dir = Yii::getPathOfAlias('webroot').'/projects/'.$prj_id .'/'.$ver_id .'/base';
if($zip->open($task_dir.'/output.zip',ZipArchive::OVERWRITE)===TRUE){
$zip->addEmptyDir("CC_Log_GUI");
$zip->addFile($root_dir.'/UI.exe', 'Tools_GUI.exe');
$zip->addFile($root_dir.'/irst.reg', 'first.reg');
$zip->addFile($root_dir.'/API.dll', 'API.dll');
$zip->addFile($root_dir.'/n.dll', 'In.dll');
//把生成的jumpbyList.json打包到zip
if(!is_dir($generatefile_dir))
{
return;
}
$handler1 = opendir($generatefile_dir);
while (($filename = readdir($handler1)) !== false)
{//务必使用!==,防止目录下出现类似文件名“0”等情况
if($filename != "." && $filename != "..")
{
$len = strlen($filename);
if(!substr_compare($filename,'st_',0,19,FALSE)) //把base的文件夹下所有的st_*.json文件都打包到zip包里
{
$zip->addFile($generatefile_dir.'/'.$filename,basename($filename));
}
}
}
closedir($handler1);
//把flf文件打包到zip包
if(!is_dir($task_dir))
{
return;
}
$handler2 = opendir($task_dir);
while (($filename = readdir($handler2)) !== false)
{
if($filename != "." && $filename != "..") //务必使用!==,防止目录下出现类似文件名“0”等情况
{
$len = strlen($filename);
if(!substr_compare($filename,'.flf',$len-4,4,FALSE)) //如果是flf文件,则需要打包到两个地方,一个是当前目录,另外是CC_Log_GUI/目录
{
$file_name = basename($filename);
$zip->addFile($task_dir.'/'.$filename,'UI/'.$file_name);
$zip->addFile($task_dir.'/'.$filename,$file_name);
}
}
}
closedir($handler2);
$zip->close();
}
}
直接使用addFile就可以简单的把所有指定文件改为指定的名称并打包到zip
现在存在一个问题,如果使用zipArchive压缩文件,怎么能确定它已经把所有文件都压缩好了呢?如果刚开始执行压缩就点击下载zip包,这样zip包里的文件是不完整的,怎么才能提供让zipArchive生成完整的zip文件再提供下载呢