php实现的zip文件内容比较类


Posted in PHP onSeptember 24, 2014

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

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

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

ZipCompare.class.php类文件如下:

<?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<$len; $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示例程序如下:

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

PHP 相关文章推荐
php5 图片验证码实现代码
Dec 11 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
Apr 26 PHP
不使用php api函数实现数组的交换排序示例
Apr 13 PHP
PHP在网页中动态生成PDF文件详细教程
Jul 05 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
Apr 03 PHP
php实现网站顶踩功能的完整前端代码
Jul 19 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
ucenter中词语过滤原理分析
Jul 13 PHP
PHP中explode函数和split函数的区别小结
Aug 24 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
php导出CSV抽象类实例
Sep 24 #PHP
php实现的双向队列类实例
Sep 24 #PHP
php实现的Timer页面运行时间监测类
Sep 24 #PHP
php密码生成类实例
Sep 24 #PHP
PHP中file_get_contents高?用法实例
Sep 24 #PHP
php实现的Cookies操作类实例
Sep 24 #PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
Sep 24 #PHP
You might like
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
初识php MVC
2014/09/10 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
JavaScript 学习笔记(六)
2009/12/31 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
Javascript实现的简单右键菜单类
2015/09/23 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
Vue如何实现响应式系统
2018/07/11 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
JointJS流程图的绘制方法
2018/12/03 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
CentOS安装pillow报错的解决方法
2016/01/27 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
Python接口测试环境搭建过程详解
2020/06/29 Python
Steve Madden官网:美国鞋类品牌
2017/01/29 全球购物
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
渗透攻击的测试步骤
2014/06/07 面试题
档案信息化建设方案
2014/05/16 职场文书
党支部特色活动方案
2014/08/20 职场文书
个人委托书范文
2015/01/28 职场文书
中学推普周活动总结
2015/05/07 职场文书
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android