免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4846 | 回复: 3

php实现的读取 gz或 tar文件包中指定的文件内容 [复制链接]

论坛徽章:
0
发表于 2010-05-18 15:18 |显示全部楼层
用到了 php的 zlib中的函数
和 unpack

  1. function getTarData($dataFile, $tarFile = null) {
  2.         //保存文件句柄便于递归时使用
  3.         static $zipFP;
  4.         //字段名 => 字段长度
  5.         $st = array(
  6.                 'name'                =>        '100',
  7.                 'mode'                =>        '8',
  8.                 'uid'                =>        '8',
  9.                 'gid'                =>        '8',
  10.                 'size'                =>        '12',
  11.                 'mtime'                =>        '12',
  12.                 'chksum'        =>        '8',
  13.                 'linkflag'  =>  '1',
  14.                 'linkname'        =>        '100',
  15.                 'magic'                =>        '8',
  16.                 'uname'                =>        '32',
  17.                 'gname'                =>        '32',
  18.                 'devmajor'        =>        '8',
  19.                 'devminor'        =>        '8',
  20.         );
  21.         //tar文件的头长度为固定的 512字节
  22.         $headerSize = 512;
  23.         if (!is_file($tarFile) && !is_resource($zipFP)) return false;
  24.         if (is_file($tarFile) && !is_resource($zipFP))
  25.                 $zipFP = gzopen($tarFile, 'r');

  26.         if (!$zipFP) return false;
  27.        
  28.         $header = gzread($zipFP, $headerSize);
  29.         $packFmt = '';
  30.         foreach ($st as $k => $v) {
  31.                 $fmt = sprintf("a%d%s", $v, $k);
  32.                 if ($packFmt)
  33.                         $packFmt .= '/' . $fmt;
  34.                 else
  35.                         $packFmt = $fmt;
  36.         }
  37.         //解码头数据
  38.         $arr = unpack($packFmt, $header);
  39.        
  40.         if (!is_array($arr) || !array_key_exists('name', $arr)) return false;

  41.         $fileSize = octdec($arr['size']);
  42.         $fileName = $arr['name'];
  43.         $fileData = '';
  44.         if ( $fileName == $dataFile) {
  45.                 while($fileSize > 0) {
  46.                         $data = gzread($zipFP, $headerSize);
  47.                         $fileSize -= strlen($data);
  48.                         $fileData .= $data;
  49.                 }
  50.                 gzclose($zipFP);
  51.                 return $fileData;
  52.         }
  53.         else {
  54.                 //下一个文件的偏移量
  55.                 $offset = $headerSize + $fileSize + ($headerSize - $fileSize % $headerSize);
  56.                 gzseek($zipFP, $offset);
  57.                 return getTarData($dataFile);
  58.         }

  59. }
复制代码

评分

参与人数 1可用积分 +10 收起 理由
bs + 10 不错

查看全部评分

论坛徽章:
0
发表于 2010-05-21 17:37 |显示全部楼层

论坛徽章:
0
发表于 2010-05-21 17:38 |显示全部楼层
再顶一下

论坛徽章:
0
发表于 2010-05-21 19:25 |显示全部楼层
支持一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP