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程序设计的学习有所帮助。