php 对比两个压缩包内容,php实现的zip文件内容比较类

本文实例讲述了php实现的zip文件内容比较类。是一个非常实用的PHP类文件。分享给大家供大家参考。具体分析如下:

该php zip文件比较类主要实现比较两个zip文件的内容,返回新增,删除,及相同的文件列表。暂时只支持单层。

需求:上传一个zip文件,zip内有很多图片文件。需要对图片文件进行一系列很耗时的处理。当用户再更新zip文件时。判断zip内文件是否一致,只处理不同的文件。这样可以节省资源与时间,因此需要编写一个能够比较zip内文件的类。

ZipCompare.class.php类文件如下:

/** Zip Compare class 比较两个zip文件的内容,返回新增,删除,及相同的文件列表,暂时只支持单层

* Date: 2014-05-18

* Author: fdipzone

* Ver: 1.0

*

* Func:

* public compare 比较zip文件内容

* private getInfo 获取zip内文件列表

* private parse 分析两个zip的文件内容

* private check 检查zip文件是否正确

* private check_handler 检查服务器是否有安装unzip

*/

class ZipCompare{ // class start

/** 比较zip文件内容,列出不相同的部分

* @param String $zipfile1 zip文件1

* @param String $zipfile2 zip文件2

* @return Array

*/

public function compare($zipfile1, $zipfile2){

// 检查是否有安装unzip

if(!$this->check_handler()){

throw new Exception('unzip not install');

}

// 检查zip文件

if(!$this->check($zipfile1) || !$this->check($zipfile2)){

throw new Exception('zipfile not exists or error');

}

// 获取zip内文件列表

$zipinfo1 = $this->getInfo($zipfile1);

$zipinfo2 = $this->getInfo($zipfile2);

// 分析两个zip的文件内容,返回相同及不同的文件列表

return $this->parse($zipinfo1, $zipinfo2);

}

/** 获取zip内文件列表

* @param String $zipfile zip文件

* @return Array zip内文件列表

*/

private function getInfo($zipfile){

// unzip -v fields

$fields = array('Length','Method','Size','Cmpr','Date','Time','CRC-32','Name');

// zip verbose

$verbose = shell_exec(sprintf("unzip -v %s | sed '\$d' | sed '\$d' | sed -n '4,\$p'", $zipfile));

// zip info

$zipinfo = array();

$filelist = explode("\n", $verbose);

if($filelist){

foreach($filelist as $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文件内容

* @param String $zipinfo1

* @param String $zipinfo2

* @return Array

*/

private function parse($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

if($zipinfo1[$match_file[$i]]==$zipinfo2[$match_file[$i]]){ // match

array_push($result['match'], $match_file[$i]);

}else{ // not match, change to add

array_push($result['add'], $match_file[$i]);

}

}

}

return $result;

}

/** 检查zip文件是否正确

* @param String $zipfile zip文件

* @return boolean

*/

private function check($zipfile){

// 文件存在且能解压

return file_exists($zipfile) && shell_exec(sprintf('unzip -v %s | wc -l', $zipfile))>1;

}

/** 检查服务器是否有安装unzip

* @return boolean

*/

private function check_handler(){

return strstr(shell_exec('unzip -v'), 'version')!='';

}

} // class end

?>

demo示例程序如下:

require "ZipCompare.class.php";

$obj = new ZipCompare();

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Exchange2010外部传输域的使用方法

安装好EX2010后并不能马上与外部邮件进行收发,需要进行以下几个配置: 1、配置接收连接器 2、配置接受域 3、配置发送连接器 可以参考这个链接:http://www.chinaemail.com.cn/server/xtfl/Exchange/201101/59114.html 下面以我的实例来说明一…

Shiro安全框架入门篇

一、Shiro框架介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权。Shiro在JavaSE和JavaEE项目中都可以使用。它主要用来处理身份认证,授权,企业会话管理和加密等。Shiro的具体功能点如下: (1)…

php 京东首页分类导航,仿京东导航栏

摘要: 仿京东顶部导航栏 仿京东顶部导航栏*{margin:0px;padding:0px;}.header{width:100%;height:35px;background-color:#E3E4E5;}.header_content{width:1200px;height:35px;margin:auto;padding:0px;}.header_left{width:300px;height:35px;line-height:35px…

asp.net ajax1.0基础回顾(七):综合应用

本文将通过学生信息管理来介绍asp.net ajax的综合应用实例,包括“浏览”、“查询”、“添加”和“多选删除”功能,以及其它相关设计。 本示例源代码下载地址:http://down.51cto.com/data/220541 本示例中,程序架构参考Petshop&…

探讨程序员如何学习你不熟悉的技术,以及用什么样的方法去学习.

由于公司的业务拓展,有一部份的程序要用Delphi来实现(基于原来的程序拓展)现在需要学习Delphi,刚开始接手时感觉不知如何下手(也许是本人才疏学浅),于是在网上找了很多资料,总是感觉…

转载:关于对REST的基本认识和理解

1.什么是 REST?REST 是属于 WEB 自身的一种架构风格,是在 HTTP 1.1 规范下实现的。Representational State Transfer 全称翻译为表现层状态转化。Resource:资源。比如 newsfeed;Representational:表现形式,比如用JSON…

php ajax取不到值,PHP没有从Ajax获取值

我一直在搜索所有的答案,但我无法让它工作。我想从ajax发送两个整数值到php。这是ajax部分:$(document).ready(function(){$(input[type"radio"]).click(function(){var id_user$(this).filter(:checked).val();var stringname$(this).attr(na…

ASP.NET MVC3书店--第五节 表单编辑(第二部分)(转)

http://blog.sina.com.cn/s/blog_6ad539a90100r469.html5.5 使用HTML帮助器来截短文字 使用我们的StoreManager控制器中的Index方法添加视图的时候,有一个潜在的问题。事实上,我们的书名与作者名属性的长度值可能超出页面上 所定义的这两个列的长度。我们…

SSL-ZYC 1760 商店选址问题

题目大意&#xff1a; 给出一个城市的地图&#xff0c;商店设在一点&#xff0c;使各个地方到商店距离之和最短。 思路&#xff1a; 这是一道最短路的问题。a[i][j]表示从i到j的最短路径&#xff0c;最终求出最小值并输出。 代码&#xff1a; #include <cstdio> #incl…

c++ java通信 protocol buffer,google protocol buffer (C++,Java序列化应用实例)

google protocol buffer (C,Java序列化使用实例)转载,请注明出处: http://blog.csdn.net/eclipser1987/article/details/8525383 (eclipser163.com)1.下载安装:google protocol buffer 的官网地址是:http://code.google.com/p/protobuf/建议下载稳定版本:protobuf-2.4.1 linu…

hadoop等的下载地址

有的时候要使用老的版本hadoop,找不到地方下载,保存连接如下http://archive.apache.org/dist/hadoop/core/http://archive.cloudera.com/cdh/3/

前端“黑话”polyfill

前言 在Web前端开发这个日新月异的时代&#xff0c;总是需要阅读一些最新的英文技术博客来跟上技术的发展的潮流。而有时候会遇到一些比较高频的“黑话”&#xff0c;在社区里面可能已经是人人皆知的“共同语言”&#xff0c;而你接触的少就偏偏看不懂。就像现在几乎所有中国人…

java 什么是线程同步,java多线程同步集合是什么?并发集合是什么?

java中关于集合的内容也是十分丰富的&#xff0c;而且相关的知识点也是十分多的。多线程集合所涵盖的范围是十分广阔的。今天就来为大家介绍一下&#xff0c;java多线程同步集合是什么以及并发集合是什么?一起来看看吧。首先我们需要知道的是&#xff0c;无论是同步集合还是并…

windwos 批处理重定向, 讲的策彻底

本帖主要参考了《命令行参考》和一些前辈的文献&#xff0c;并加入了我自己的一些理解&#xff0c;希望能对各位有所帮助。 《命令行参考》中对重定向操作符有所论述&#xff0c;不过实在晦涩难懂&#xff0c;并且还有些错误&#xff0c;不利于大家理解。重定向的简单用法相信大…

matlab里符号的写法,Matlab中特殊符号的写法

Matlab的figure中输入上标、下标、特殊符号或字体坐标轴标注&#xff1a;1. 控制坐标轴尺度长度&#xff1a;set(gca,XLim,[-pi/2 pi])2. 定制自己想标注的刻度&#xff1a;(1)set(gca,XTick,[-pi/2:pi/4:pi])(2)set(gca,XTickLabel,{-pi/2 -pi/4: 0 pi/4 pi/2 pi*3/4 pi})3. 反…

VB.NET怎样开发自定义Windows控件

前言 Microsoft&reg; Visual Basic&reg; 的组件支持历来都是它的一大卖点&#xff0c;于是第三方软件开发商们纷纷开发出各种具有新功能性的可视控件 (也有少数非可视控件) 供 Visual Basic 程序员选用。这种特殊的 Visual Basic 开发形式创造了无数的第三方控件——有…

内核配置

make config&#xff1a;基于文本模式的交互式配置。 make menuconfig&#xff1a;基于文本模式的菜单型配置。&#xff08;推荐使用&#xff0c;空格键选择&#xff1a;*&#xff1a;y&#xff0c;M:M,空格&#xff1a;N&#xff09; make oldconfig&#xff1a;使用已有的配置…

mysql数据库面试总结(一)

1、数据库优化  1&#xff09;数据库范式 第一范式&#xff08;1NF&#xff09;&#xff1a;强调的是列的原子性&#xff0c;即列不能够再分成其他几列。 如电话列可进行拆分---家庭电话、公司电话 第二范式&#xff08;2NF&#xff09;&#xff1a;首先是 1NF&#xff0c;另外…

思科路由器IKEV2 L2L***预共享密码认证最简化配置

一.概述:思科路由器对于IKEV2&#xff0c;是有很多预配的&#xff0c;因此可以很少的配置就能完成IKEV2的配置。二.基本思路&#xff1a;A.两边都用SVTI的方式配置Flex ***B.没有用动态路由&#xff0c;配置静态路由,如果一边用DVTI&#xff0c;则需要两边配置静态路由三.测试拓…

Oracle存储过程学习

存储过程创建语法&#xff1a; create or replace procedure 存储过程名&#xff08;param1 in type&#xff0c;param2 out type&#xff09; as 变量1 类型&#xff08;值范围&#xff09;; 变量2 类型&#xff08;值范围&#xff09;; Begin Select count(*) into 变量1 fro…