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 相关文章推荐
第五章 php数组操作
Dec 30 PHP
深入php define()函数以及defined()函数的用法详解
Jun 05 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
整理php防注入和XSS攻击通用过滤
Sep 13 PHP
PHP MYSQL实现登陆和模糊查询两大功能
Feb 05 PHP
PHP使用file_get_content设置头信息的方法
Feb 14 PHP
使用php实现从身份证中提取生日
May 09 PHP
Yii2框架dropDownList下拉菜单用法实例分析
Jul 18 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
Aug 01 PHP
Ajax+PHP实现的模拟进度条功能示例
Feb 11 PHP
PHP实用小技巧之调用录像的方法
Dec 05 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设计聊天室步步通
2006/10/09 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
javascript各种复制代码收集
2008/09/20 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
JS打开新窗口的2种方式
2013/04/18 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
2013/05/06 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
vue实现文件上传功能
2018/08/13 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
vue-cli4使用全局less文件中的变量配置操作
2020/10/21 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
Python部署web开发程序的几种方法
2017/05/05 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
在python里面运用多继承方法详解
2019/07/01 Python
python3.6编写的单元测试示例
2019/08/17 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
什么叫做SQL注入,如何防止
2016/10/04 面试题
优秀班集体获奖感言
2014/02/03 职场文书
《夹竹桃》教学反思
2014/04/20 职场文书
银行求职自荐信
2014/06/30 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
仙境之桥观后感
2015/06/16 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书