一个php实现的zip文件内容比较类及其用法,可实现比较两个zip文件的内容,返回新增、删除、及相同的文件列表。
php实现的zip文件内容比较类。是一个非常实用的php类文件。
该php zip文件比较类主要实现比较两个zip文件的内容,返回新增,删除,及相同的文件列表。暂时只支持单层。
需求:上传一个zip文件,zip内有很多图片文件。需要对图片文件进行一系列很耗时的处理。当用户再更新zip文件时。判断zip内文件是否一致,只处理不同的文件。这样可以节省资源与时间,因此需要编写一个能够比较zip内文件的类。
zipcompare.class.php类文件如下:
<?<span>php
</span><span>/*</span><span>* Zip Compare class 比较两个zip文件的内容,返回新增,删除,及相同的文件列表,暂时只支持单层
* Date: 2014-05-18
* Author: fdipzone
* Ver: 1.0
* www.jbxue.com
* Func:
* public compare 比较zip文件内容
* private getInfo 获取zip内文件列表
* private parse 分析两个zip的文件内容
* private check 检查zip文件是否正确
* private check_handler 检查服务器是否有安装unzip
</span><span>*/</span>
<span>class</span> ZipCompare{ <span>//</span><span> class start </span>
<span>/*</span><span>* 比较zip文件内容,列出不相同的部分
* @param String $zipfile1 zip文件1
* @param String $zipfile2 zip文件2
* @return Array
</span><span>*/</span>
<span>public</span> <span>function</span> compare(<span>$zipfile1</span>, <span>$zipfile2</span><span>){
</span><span>//</span><span> 检查是否有安装unzip </span>
<span>if</span>(!<span>$this</span>-><span>check_handler()){
</span><span>throw</span> <span>new</span> <span>Exception</span>('unzip not install'<span>);
}
</span><span>//</span><span> 检查zip文件 </span>
<span>if</span>(!<span>$this</span>->check(<span>$zipfile1</span>) || !<span>$this</span>->check(<span>$zipfile2</span><span>)){
</span><span>throw</span> <span>new</span> <span>Exception</span>('zipfile not exists or error'<span>);
}
</span><span>//</span><span> 获取zip内文件列表 </span>
<span>$zipinfo1</span> = <span>$this</span>->getInfo(<span>$zipfile1</span><span>);
</span><span>$zipinfo2</span> = <span>$this</span>->getInfo(<span>$zipfile2</span><span>);
</span><span>//</span><span> 分析两个zip的文件内容,返回相同及不同的文件列表 </span>
<span>return</span> <span>$this</span>->parse(<span>$zipinfo1</span>, <span>$zipinfo2</span><span>);
}
</span><span>/*</span><span>* 获取zip内文件列表
* @param String $zipfile zip文件
* @return Array zip内文件列表
</span><span>*/</span>
<span>private</span> <span>function</span> getInfo(<span>$zipfile</span><span>){
</span><span>//</span><span> unzip -v fields </span>
<span>$fields</span> = <span>array</span>('Length','Method','Size','Cmpr','Date','Time','CRC-32','Name'<span>);
</span><span>//</span><span> zip verbose </span>
<span>$verbose</span> = <span>shell_exec</span>(<span>sprintf</span>("unzip -v %s | sed '\$d' | sed '\$d' | sed -n '4,\$p'", <span>$zipfile</span><span>));
</span><span>//</span><span> zip info </span>
<span>$zipinfo</span> = <span>array</span><span>();
</span><span>$filelist</span> = <span>explode</span>("\n", <span>$verbose</span><span>);
</span><span>if</span>(<span>$filelist</span><span>){
</span><span>foreach</span>(<span>$filelist</span> <span>as</span> <span>$rowdata</span><span>){
</span><span>if</span>(<span>$rowdata</span>==''<span>){
</span><span>continue</span><span>;
}
</span><span>$rowdata</span> = <span>preg_replace</span>('/[ ]{2,}/', ' ', <span>$rowdata</span>); <span>//</span><span> 将两个或以上空格替换为一个 </span>
<span>$tmp</span> = <span>array_slice</span>(<span>explode</span>(' ', <span>$rowdata</span>), 1); <span>//</span><span> 去掉第一个空格 </span>
<span>$file</span> = <span>array_combine</span>(<span>$fields</span>, <span>$tmp</span><span>);
</span><span>$zipinfo</span>[<span>$file</span>['Name']] = <span>$file</span>['Length'].'_'.<span>$file</span>['CRC-32']; <span>//</span><span> 文件名,长度,CRC32,用于校验 </span>
<span>}
}
</span><span>return</span> <span>$zipinfo</span><span>;
}
</span><span>/*</span><span>* 分析两个zip文件内容
* @param String $zipinfo1
* @param String $zipinfo2
* @return Array
</span><span>*/</span>
<span>private</span> <span>function</span> parse(<span>$zipinfo1</span>, <span>$zipinfo2</span><span>){
</span><span>$result</span> = <span>array</span><span>(
</span>'add' => <span>array</span>(), <span>//</span><span> 新增 </span>
'del' => <span>array</span>(), <span>//</span><span> 缺少 </span>
'match' => <span>array</span>() <span>//</span><span> 匹配 </span>
<span>);
</span><span>if</span>(<span>$zipinfo1</span> && <span>$zipinfo2</span><span>){
</span><span>//</span><span> 在zip1但不在zip2的文件 </span>
<span>$result</span>['add'] = <span>array_values</span>(<span>array_diff</span>(<span>array_keys</span>(<span>$zipinfo1</span>), <span>array_keys</span>(<span>$zipinfo2</span><span>)));
</span><span>//</span><span> 在zip2但不在zip1的文件 </span>
<span>$result</span>['del'] = <span>array_values</span>(<span>array_diff</span>(<span>array_keys</span>(<span>$zipinfo2</span>), <span>array_keys</span>(<span>$zipinfo1</span><span>)));
</span><span>//</span><span> 同时在zip1与zip2的文件 </span>
<span>$match_file</span> = <span>array_values</span>(<span>array_diff</span>(<span>array_keys</span>(<span>$zipinfo1</span>), <span>$result</span>['add'<span>]));
</span><span>//</span><span> 检查相同文件名的文件内容是否匹配 </span>
<span>for</span>(<span>$i</span>=0,<span>$len</span>=<span>count</span>(<span>$match_file</span>); <span>$i</span><<span>$len</span>; <span>$i</span>++<span>){
</span><span>if</span>(<span>$zipinfo1</span>[<span>$match_file</span>[<span>$i</span>]]==<span>$zipinfo2</span>[<span>$match_file</span>[<span>$i</span>]]){ <span>//</span><span> match </span>
<span>array_push</span>(<span>$result</span>['match'], <span>$match_file</span>[<span>$i</span><span>]);
}</span><span>else</span>{ <span>//</span><span> not match, change to add </span>
<span>array_push</span>(<span>$result</span>['add'], <span>$match_file</span>[<span>$i</span><span>]);
}
}
}
</span><span>return</span> <span>$result</span><span>;
}
</span><span>/*</span><span>* 检查zip文件是否正确
* @param String $zipfile zip文件
* @return boolean
</span><span>*/</span>
<span>private</span> <span>function</span> check(<span>$zipfile</span><span>){
</span><span>//</span><span> 文件存在且能解压 </span>
<span>return</span> <span>file_exists</span>(<span>$zipfile</span>) && <span>shell_exec</span>(<span>sprintf</span>('unzip -v %s | wc -l', <span>$zipfile</span>))>1<span>;
}
</span><span>/*</span><span>* 检查服务器是否有安装unzip
* @return boolean
</span><span>*/</span>
<span>private</span> <span>function</span><span> check_handler(){
</span><span>return</span> <span>strstr</span>(<span>shell_exec</span>('unzip -v'), 'version')!=''<span>;
}
} </span><span>//</span><span> class end </span>
?>demo示例程序如下:
<?<span>php
</span><span>require</span> "ZipCompare.class.php"<span>;
</span><span>$obj</span> = <span>new</span><span> ZipCompare();
</span><span>$result</span> = <span>$obj</span>->compare('test1.zip','test2.zip'<span>);
</span><span>print_r</span>(<span>$result</span><span>);
</span>?>执行后输出:
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怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号