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 相关文章推荐
PHP4实际应用经验篇(9)
Oct 09 PHP
php 保留小数点
Apr 21 PHP
phpMyAdmin链接MySql错误 个人解决方案
Dec 28 PHP
php结合表单实现一些简单功能的例子
Jun 04 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
Jan 19 PHP
CI(CodeIgniter)框架中的增删改查操作
Jun 10 PHP
php中实现可以返回多个值的函数实例
Mar 21 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 PHP
PHP压缩图片功能的介绍
Mar 21 PHP
php接口隔离原则实例分析
Nov 11 PHP
深入分析PHP设计模式
Jun 15 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 判断服务器操作系统的类型
2014/02/17 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
JS的Document属性和方法小结
2013/09/17 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
2016/12/31 Javascript
ajax分页效果(bootstrap模态框)
2017/01/23 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
python 换位密码算法的实例详解
2017/07/19 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
django 外键创建注意事项说明
2020/05/20 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
大一新生军训时的自我评价分享
2013/12/05 职场文书
高中物理教学反思
2014/02/08 职场文书
梅花魂教学反思
2014/04/25 职场文书
爱护公物标语
2014/06/24 职场文书
2014年党员发展工作总结
2014/12/02 职场文书
员工辞职信怎么写
2015/02/27 职场文书
2015年保管员工作总结
2015/04/30 职场文书
科级干部培训心得体会
2016/01/06 职场文书
幼儿园家长心得体会
2016/01/21 职场文书
《海上日出》教学反思
2016/02/23 职场文书
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js