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 相关文章推荐
为查询结果建立向后/向前按钮
Oct 09 PHP
php ajax 静态分页过程形式
Sep 02 PHP
php xml常用函数的集合(比较详细)
Jun 06 PHP
PHP引用符&amp;的用法详细解析
Aug 22 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
PHP中cookie和session的区别实例分析
Aug 28 PHP
Linux下安装oracle客户端并配置php5.3
Oct 12 PHP
php多线程实现方法及用法实例详解
Oct 26 PHP
微信支付PHP SDK ―― 公众号支付代码详解
Sep 13 PHP
PHP实现微信图片上传到服务器的方法示例
Jun 29 PHP
一个非常实用的php文件上传类
Jul 04 PHP
详解PHP用mb_string处理windows中文字符
May 26 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判断字符串长度的两种方法很实用
2015/09/22 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
jquery animate动画持续运动的实例
2017/11/29 jQuery
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
JavaScript基于面向对象实现的无缝滚动轮播示例
2020/01/17 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
Python类的基础入门知识
2008/11/24 Python
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
pandas对指定列进行填充的方法
2018/04/11 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
Python插件机制实现详解
2020/05/04 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
法国足球商店:Footcenter
2019/07/06 全球购物
如何选择使用结构还是类
2014/05/30 面试题
实习老师个人总结的自我评价
2013/09/28 职场文书
个人现实表现材料
2014/02/04 职场文书
手机促销活动方案
2014/02/05 职场文书
会计员岗位职责
2014/03/15 职场文书
感情真挚的毕业生求职信
2014/07/19 职场文书
工作检讨书500字
2014/10/19 职场文书
优秀党员申报材料
2014/12/18 职场文书
德能勤绩工作总结
2015/08/11 职场文书
python如何进行基准测试
2021/04/26 Python
Pygame Time时间控制的具体使用详解
2021/11/17 Python
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL