php实现的zip文件内容比较类
本文实例讲述了php实现的zip文件内容比较类。是一个非常实用的PHP类文件。分享给大家供大家参考。具体分析如下:
该phpzip文件比较类主要实现比较两个zip文件的内容,返回新增,删除,及相同的文件列表。暂时只支持单层。
需求:上传一个zip文件,zip内有很多图片文件。需要对图片文件进行一系列很耗时的处理。当用户再更新zip文件时。判断zip内文件是否一致,只处理不同的文件。这样可以节省资源与时间,因此需要编写一个能够比较zip内文件的类。
ZipCompare.class.php类文件如下:
<?php /**ZipCompareclass比较两个zip文件的内容,返回新增,删除,及相同的文件列表,暂时只支持单层 *Date:2014-05-18 *Author:fdipzone *Ver:1.0 * *Func: *publiccompare比较zip文件内容 *privategetInfo获取zip内文件列表 *privateparse分析两个zip的文件内容 *privatecheck检查zip文件是否正确 *privatecheck_handler检查服务器是否有安装unzip */ classZipCompare{//classstart /**比较zip文件内容,列出不相同的部分 *@paramString$zipfile1zip文件1 *@paramString$zipfile2zip文件2 *@returnArray */ publicfunctioncompare($zipfile1,$zipfile2){ //检查是否有安装unzip if(!$this->check_handler()){ thrownewException('unzipnotinstall'); } //检查zip文件 if(!$this->check($zipfile1)||!$this->check($zipfile2)){ thrownewException('zipfilenotexistsorerror'); } //获取zip内文件列表 $zipinfo1=$this->getInfo($zipfile1); $zipinfo2=$this->getInfo($zipfile2); //分析两个zip的文件内容,返回相同及不同的文件列表 return$this->parse($zipinfo1,$zipinfo2); } /**获取zip内文件列表 *@paramString$zipfilezip文件 *@returnArrayzip内文件列表 */ privatefunctiongetInfo($zipfile){ //unzip-vfields $fields=array('Length','Method','Size','Cmpr','Date','Time','CRC-32','Name'); //zipverbose $verbose=shell_exec(sprintf("unzip-v%s|sed'\$d'|sed'\$d'|sed-n'4,\$p'",$zipfile)); //zipinfo $zipinfo=array(); $filelist=explode("\n",$verbose); if($filelist){ foreach($filelistas$rowdata){ if($rowdata==''){ continue; } $rowdata=preg_replace('/[]{2,}/','',$rowdata);//将两个或以上空格替换为一个 $tmp=array_slice(explode('',$rowdata),1);//去掉第一个空格 $file=array_combine($fields,$tmp); $zipinfo[$file['Name']]=$file['Length'].'_'.$file['CRC-32'];//文件名,长度,CRC32,用于校验 } } return$zipinfo; } /**分析两个zip文件内容 *@paramString$zipinfo1 *@paramString$zipinfo2 *@returnArray */ privatefunctionparse($zipinfo1,$zipinfo2){ $result=array( 'add'=>array(),//新增 'del'=>array(),//缺少 'match'=>array()//匹配 ); if($zipinfo1&&$zipinfo2){ //在zip1但不在zip2的文件 $result['add']=array_values(array_diff(array_keys($zipinfo1),array_keys($zipinfo2))); //在zip2但不在zip1的文件 $result['del']=array_values(array_diff(array_keys($zipinfo2),array_keys($zipinfo1))); //同时在zip1与zip2的文件 $match_file=array_values(array_diff(array_keys($zipinfo1),$result['add'])); //检查相同文件名的文件内容是否匹配 for($i=0,$len=count($match_file);$i<$len;$i++){ if($zipinfo1[$match_file[$i]]==$zipinfo2[$match_file[$i]]){//match array_push($result['match'],$match_file[$i]); }else{//notmatch,changetoadd array_push($result['add'],$match_file[$i]); } } } return$result; } /**检查zip文件是否正确 *@paramString$zipfilezip文件 *@returnboolean */ privatefunctioncheck($zipfile){ //文件存在且能解压 returnfile_exists($zipfile)&&shell_exec(sprintf('unzip-v%s|wc-l',$zipfile))>1; } /**检查服务器是否有安装unzip *@returnboolean */ privatefunctioncheck_handler(){ returnstrstr(shell_exec('unzip-v'),'version')!=''; } }//classend ?>
demo示例程序如下:
<?php require"ZipCompare.class.php"; $obj=newZipCompare(); $result=$obj->compare('test1.zip','test2.zip'); print_r($result); ?>
执行后输出:
Array ( [add]=>Array ( [0]=>9.jpg ) [del]=>Array ( [0]=>5.jpg [1]=>6.jpg [2]=>7.jpg [3]=>8.jpg ) [match]=>Array ( [0]=>1.jpg [1]=>10.jpg [2]=>11.jpg [3]=>12.jpg [4]=>13.jpg [5]=>14.jpg [6]=>15.jpg [7]=>16.jpg [8]=>17.jpg [9]=>18.jpg [10]=>2.jpg [11]=>3.jpg [12]=>4.jpg ) )
完整实例代码点击此处本站下载。
希望本文所述对大家PHP程序设计的学习有所帮助。