php zip文件内容比较类,
一个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
)
)

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。