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 相关文章推荐
截获网站title标签之家内容的例子
Oct 09 PHP
PHP简单系统查询模块代码打包下载
Jun 07 PHP
PHP mcrypt可逆加密算法分析
Jul 19 PHP
php后退一页表单内容保存实现方法
Jun 17 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
Jun 30 PHP
php基于str_pad实现卡号不足位数自动补0的方法
Nov 12 PHP
php实现字符串首字母转换成大写的方法
Mar 17 PHP
PHP+MySQL之Insert Into数据插入用法分析
Sep 27 PHP
php parse_str() 函数的定义和用法
May 23 PHP
php实现简单的权限管理的示例代码
Aug 25 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
Mar 22 PHP
php5对象复制、clone、浅复制与深复制实例详解
Aug 14 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文章按日期(月日)SQL归档语句
2012/11/29 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
tp5修改(实现即点即改)
2019/10/18 PHP
Z-Blog中用到的js代码
2007/03/15 Javascript
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
3款实用的在线JS代码工具(国外)
2012/03/15 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
python实现百度关键词排名查询
2014/03/30 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
keras:model.compile损失函数的用法
2020/07/01 Python
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
建议书标准格式
2014/03/12 职场文书
春节晚会主持词
2014/03/24 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
高中信息技术教学反思
2016/02/16 职场文书
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang
python playwright之元素定位示例详解
2022/07/23 Python