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下使用无限生命期Session的方法
Mar 16 PHP
php zend 相对路径问题
Jan 12 PHP
php expects parameter 1 to be resource, array given 错误
Mar 23 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 PHP
PHP date函数常用时间处理方法
May 11 PHP
php中 ob_start等函数截取标准输出的方法
Jun 22 PHP
Yii使用技巧大汇总
Dec 29 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
Jan 07 PHP
php HTML无刷新提交表单
Apr 05 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
PHP实现百度人脸识别
May 06 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基础陷阱题(变量赋值)
2012/09/12 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
jquery图片滚动放大代码分享(1)
2015/08/25 Javascript
javascript中加var和不加var的区别 你真的懂吗
2016/01/06 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
Bootstrap按钮组件详解
2016/04/26 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python实现simhash算法实例
2014/04/25 Python
神经网络理论基础及Python实现详解
2017/12/15 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
python不相等的两个字符串的 if 条件判断为True详解
2020/03/12 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
css3 transform属性详解
2014/09/30 HTML / CSS
优秀毕业大学生推荐信
2013/11/13 职场文书
告诉你怎样写创业计划书
2014/01/27 职场文书
称象教学反思
2014/02/03 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
犯错检讨书
2014/02/21 职场文书
婚前协议书标准版
2014/10/19 职场文书
民用住房租房协议书
2014/10/29 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
2016年社区植树节活动总结
2016/03/16 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript