php 压缩与解压缩文件 :ZipArchive

一开始使用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文件再提供下载呢


你可能感兴趣的:(压缩,PHP,递归,yii)