热门标签 | HotTags
当前位置:  开发笔记 > 大数据 > 正文

PHP解压ZIP的一个类

//以下是类及函数定义classZip//ZIP压缩类{var$datasec,$ctrl_dir=array();var$eof_ctrl_dir="\x50\x4b\x05\x06\x00\x00\x00\x00";var$old_offset=0

 

  //以下是类及函数定义

  class Zip //ZIP压缩类

  {

  var $datasec, $ctrl_dir = array();

  var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";

  var $old_offset = 0; var $dirs = Array(".");

  function get_List($zip_name)

  {

  $zip = @fopen($zip_name, 'rb');

  if(!$zip) return(0);

  $centd = $this->ReadCentralDir($zip,$zip_name);

  @rewind($zip);

  @fseek($zip, $centd['offset']);

  for ($i=0; $i<$centd[&#39;entries&#39;]; $i++)

  {

  $header = $this->ReadCentralFileHeaders($zip);

  $header[&#39;index&#39;] = $i;$info[&#39;filename&#39;] = $header[&#39;filename&#39;];

  $info[&#39;stored_filename&#39;] = $header[&#39;stored_filename&#39;];

  $info[&#39;size&#39;] = $header[&#39;size&#39;];$info[&#39;compressed_size&#39;]=$header[&#39;compressed_size&#39;];

  $info[&#39;crc&#39;] = strtoupper(dechex( $header[&#39;crc&#39;] ));

  $info[&#39;mtime&#39;] = $header[&#39;mtime&#39;]; $info[&#39;comment&#39;] = $header[&#39;comment&#39;];

  $info[&#39;folder&#39;] = ($header[&#39;external&#39;]==0x41FF0010||$header[&#39;external&#39;]==16)?1:0;

  $info[&#39;index&#39;] = $header[&#39;index&#39;];$info[&#39;status&#39;] = $header[&#39;status&#39;];

  $ret[]=$info; unset($header);

  }

  return $ret;

  }

  function Add($files,$compact)

  {

  if(!is_array($files[0])) $files=Array($files);

  for($i=0;$files[$i];$i++){

  $fn = $files[$i];

  if(!in_Array(dirname($fn[0]),$this->dirs))

  $this->add_Dir(dirname($fn[0]));

  if(basename($fn[0]))

  $ret[basename($fn[0])]=$this->add_File($fn[1],$fn[0],$compact);

  }

  return $ret;

  }

  function get_file()

  {

  $data = implode(&#39;&#39;, $this -> datasec);

  $ctrldir = implode(&#39;&#39;, $this -> ctrl_dir);

  return $data . $ctrldir . $this -> eof_ctrl_dir .

  pack(&#39;v&#39;, sizeof($this -> ctrl_dir)).pack(&#39;v&#39;, sizeof($this -> ctrl_dir)).

  pack(&#39;V&#39;, strlen($ctrldir)) . pack(&#39;V&#39;, strlen($data)) . "\x00\x00";

  }

  function add_dir($name)

  {

  $name = str_replace("\\", "/", $name);

  $fr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";

  $fr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );

  $fr .= pack("v", 0 ).$name.pack("V", 0).pack("V", 0).pack("V", 0);

  $this -> datasec[] = $fr;

  $new_offset = strlen(implode("", $this->datasec));

  $cdrec = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";

  $cdrec .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );

  $cdrec .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 );

  $ext = "\xff\xff\xff\xff";

  $cdrec .= pack("V", 16 ).pack("V", $this -> old_offset ).$name;

  $this -> ctrl_dir[] = $cdrec;

  $this -> old_offset = $new_offset;

  $this -> dirs[] = $name;

  }

  function add_File($data, $name, $compact = 1)

  {

  $name = str_replace(&#39;\\&#39;, &#39;/&#39;, $name);

  $dtime = dechex($this->DosTime());

  $hexdtime = &#39;\x&#39; . $dtime[6] . $dtime[7].&#39;\x&#39;.$dtime[4] . $dtime[5]

  . &#39;\x&#39; . $dtime[2] . $dtime[3].&#39;\x&#39;.$dtime[0].$dtime[1];

  eval(&#39;$hexdtime = "&#39; . $hexdtime . &#39;";&#39;);

  if($compact)

  $fr = "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00".$hexdtime;

  else $fr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00".$hexdtime;

  $unc_len = strlen($data); $crc = crc32($data);

  if($compact){

  $zdata = gzcompress($data); $c_len = strlen($zdata);

  $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);

  }else{

  $zdata = $data;

  }

  $c_len=strlen($zdata);

  $fr .= pack(&#39;V&#39;, $crc).pack(&#39;V&#39;, $c_len).pack(&#39;V&#39;, $unc_len);

  $fr .= pack(&#39;v&#39;, strlen($name)).pack(&#39;v&#39;, 0).$name.$zdata;

  $fr .= pack(&#39;V&#39;, $crc).pack(&#39;V&#39;, $c_len).pack(&#39;V&#39;, $unc_len);

  $this -> datasec[] = $fr;

  $new_offset = strlen(implode(&#39;&#39;, $this->datasec));

  if($compact)

  $cdrec = "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00";

  else $cdrec = "\x50\x4b\x01\x02\x14\x00\x0a\x00\x00\x00\x00\x00";

  $cdrec .= $hexdtime.pack(&#39;V&#39;, $crc).pack(&#39;V&#39;, $c_len).pack(&#39;V&#39;, $unc_len);

  $cdrec .= pack(&#39;v&#39;, strlen($name) ).pack(&#39;v&#39;, 0 ).pack(&#39;v&#39;, 0 );

  $cdrec .= pack(&#39;v&#39;, 0 ).pack(&#39;v&#39;, 0 ).pack(&#39;V&#39;, 32 );

  $cdrec .= pack(&#39;V&#39;, $this -> old_offset );

  $this -> old_offset = $new_offset;

  $cdrec .= $name;

  $this -> ctrl_dir[] = $cdrec;

  return true;

  }

  function DosTime() {

  $timearray = getdate();

  if ($timearray[&#39;year&#39;] <1980) {

  $timearray[&#39;year&#39;] = 1980; $timearray[&#39;mon&#39;] = 1;

  $timearray[&#39;mday&#39;] = 1; $timearray[&#39;hours&#39;] = 0;

  $timearray[&#39;minutes&#39;] = 0; $timearray[&#39;seconds&#39;] = 0;

  }

  return (($timearray[&#39;year&#39;] - 1980) <<25) | ($timearray[&#39;mon&#39;] <<21) | ($timearray[&#39;mday&#39;] <<16) | ($timearray[&#39;hours&#39;] <<11) |

  ($timearray[&#39;minutes&#39;] <<5) | ($timearray[&#39;seconds&#39;] >> 1);

  }

  function Extract ( $zn, $to, $index = Array(-1) )

  {

  $ok = 0; $zip = @fopen($zn,&#39;rb&#39;);

  if(!$zip) return(-1);

  $cdir = $this->ReadCentralDir($zip,$zn);

  $pos_entry = $cdir[&#39;offset&#39;];

  if(!is_array($index)){ $index = array($index); }

  for($i=0; $index[$i];$i++){

  if(intval($index[$i])!=$index[$i]||$index[$i]>$cdir[&#39;entries&#39;])

  return(-1);

  }

  for ($i=0; $i<$cdir[&#39;entries&#39;]; $i++)

  {

  @fseek($zip, $pos_entry);

  $header = $this->ReadCentralFileHeaders($zip);

  $header[&#39;index&#39;] = $i; $pos_entry = ftell($zip);

  @rewind($zip); fseek($zip, $header[&#39;offset&#39;]);

  if(in_array("-1",$index)||in_array($i,$index))

  $stat[$header[&#39;filename&#39;]]=$this->ExtractFile($header, $to, $zip);

  }

  fclose($zip);

  return $stat;

  }

  function ReadFileHeader($zip)

  {

  $binary_data = fread($zip, 30);

  $data = unpack(&#39;vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len&#39;, $binary_data);

  $header[&#39;filename&#39;] = fread($zip, $data[&#39;filename_len&#39;]);

  if ($data[&#39;extra_len&#39;] != 0) {

  $header[&#39;extra&#39;] = fread($zip, $data[&#39;extra_len&#39;]);

  } else { $header[&#39;extra&#39;] = &#39;&#39;; }

  $header[&#39;compression&#39;] = $data[&#39;compression&#39;];$header[&#39;size&#39;] = $data[&#39;size&#39;];

  $header[&#39;compressed_size&#39;] = $data[&#39;compressed_size&#39;];

  $header[&#39;crc&#39;] = $data[&#39;crc&#39;]; $header[&#39;flag&#39;] = $data[&#39;flag&#39;];

  $header[&#39;mdate&#39;] = $data[&#39;mdate&#39;];$header[&#39;mtime&#39;] = $data[&#39;mtime&#39;];

  if ($header[&#39;mdate&#39;] && $header[&#39;mtime&#39;]){

  $hour=($header[&#39;mtime&#39;]&0xF800)>>11;$minute=($header[&#39;mtime&#39;]&0x07E0)>>5;

  $secOnde=($header[&#39;mtime&#39;]&0x001F)*2;$year=(($header[&#39;mdate&#39;]&0xFE00)>>9)+1980;

  $mOnth=($header[&#39;mdate&#39;]&0x01E0)>>5;$day=$header[&#39;mdate&#39;]&0x001F;

  $header[&#39;mtime&#39;] = mktime($hour, $minute, $seconde, $month, $day, $year);

  }else{$header[&#39;mtime&#39;] = time();}

  $header[&#39;stored_filename&#39;] = $header[&#39;filename&#39;];

  $header[&#39;status&#39;] = "ok";

  return $header;

  }

  function ReadCentralFileHeaders($zip){

  $binary_data = fread($zip, 46);

  $header = unpack(&#39;vchkid/vid/vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset&#39;, $binary_data);

  if ($header[&#39;filename_len&#39;] != 0)

  $header[&#39;filename&#39;] = fread($zip,$header[&#39;filename_len&#39;]);

  else $header[&#39;filename&#39;] = &#39;&#39;;

  if ($header[&#39;extra_len&#39;] != 0)

  $header[&#39;extra&#39;] = fread($zip, $header[&#39;extra_len&#39;]);

  else $header[&#39;extra&#39;] = &#39;&#39;;

  if ($header[&#39;comment_len&#39;] != 0)

  $header[&#39;comment&#39;] = fread($zip, $header[&#39;comment_len&#39;]);

  else $header[&#39;comment&#39;] = &#39;&#39;;

  if ($header[&#39;mdate&#39;] && $header[&#39;mtime&#39;])

  {

  $hour = ($header[&#39;mtime&#39;] & 0xF800) >> 11;

  $minute = ($header[&#39;mtime&#39;] & 0x07E0) >> 5;

  $secOnde= ($header[&#39;mtime&#39;] & 0x001F)*2;

  $year = (($header[&#39;mdate&#39;] & 0xFE00) >> 9) + 1980;

  $mOnth= ($header[&#39;mdate&#39;] & 0x01E0) >> 5;

  $day = $header[&#39;mdate&#39;] & 0x001F;

  $header[&#39;mtime&#39;] = mktime($hour, $minute, $seconde, $month, $day, $year);

  } else {

  $header[&#39;mtime&#39;] = time();

  }

  $header[&#39;stored_filename&#39;] = $header[&#39;filename&#39;];

  $header[&#39;status&#39;] = &#39;ok&#39;;

  if (substr($header[&#39;filename&#39;], -1) == &#39;/&#39;)

  $header[&#39;external&#39;] = 0x41FF0010;

  return $header;

  }

  function ReadCentralDir($zip,$zip_name)

  {

  $size = filesize($zip_name);

  if ($size <277) $maximum_size = $size;

  else $maximum_size=277;

  @fseek($zip, $size-$maximum_size);

  $pos = ftell($zip); $bytes = 0x00000000;

  while ($pos <$size)

  {

  $byte = @fread($zip, 1); $bytes=($bytes <<8) | Ord($byte);

  if ($bytes == 0x504b0506){ $pos++; break; } $pos++;

  }

  $data=unpack(&#39;vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size&#39;,fread($zip,18));

  if ($data[&#39;comment_size&#39;] != 0)

  $centd[&#39;comment&#39;] = fread($zip, $data[&#39;comment_size&#39;]);

  else $centd[&#39;comment&#39;] = &#39;&#39;; $centd[&#39;entries&#39;] = $data[&#39;entries&#39;];

  $centd[&#39;disk_entries&#39;] = $data[&#39;disk_entries&#39;];

  $centd[&#39;offset&#39;] = $data[&#39;offset&#39;];$centd[&#39;disk_start&#39;] = $data[&#39;disk_start&#39;];

  $centd[&#39;size&#39;] = $data[&#39;size&#39;]; $centd[&#39;disk&#39;] = $data[&#39;disk&#39;];

  return $centd;

  }

  function ExtractFile($header,$to,$zip)

  {

  $header = $this->readfileheader($zip);

  if(substr($to,-1)!="/") $to.="/";

  if(!@is_dir($to)) @mkdir($to,0777);

  $pth = explode("/",dirname($header[&#39;filename&#39;]));

  for($i=0;isset($pth[$i]);$i++){

  if(!$pth[$i]) continue;$pthss.=$pth[$i]."/";

  if(!is_dir($to.$pthss)) @mkdir($to.$pthss,0777);

  }

  if (!($header[&#39;external&#39;]==0x41FF0010)&&!($header[&#39;external&#39;]==16))

  {

  if ($header[&#39;compression&#39;]==0)

  {

  $fp = @fopen($to.$header[&#39;filename&#39;], &#39;wb&#39;);

  if(!$fp) return(-1);

  $size = $header[&#39;compressed_size&#39;];

  while ($size != 0)

  {

  $read_size = ($size <2048 ? $size : 2048);

  $buffer = fread($zip, $read_size);

  $binary_data = pack(&#39;a&#39;.$read_size, $buffer);

  @fwrite($fp, $binary_data, $read_size);

  $size -= $read_size;

  }

  fclose($fp);

  touch($to.$header[&#39;filename&#39;], $header[&#39;mtime&#39;]);

  }else{

  $fp = @fopen($to.$header[&#39;filename&#39;].&#39;.gz&#39;,&#39;wb&#39;);

  if(!$fp) return(-1);

  $binary_data = pack(&#39;va1a1Va1a1&#39;, 0x8b1f, Chr($header[&#39;compression&#39;]),

  Chr(0x00), time(), Chr(0x00), Chr(3));

  fwrite($fp, $binary_data, 10);

  $size = $header[&#39;compressed_size&#39;];

  while ($size != 0)

  {

  $read_size = ($size <1024 ? $size : 1024);

  $buffer = fread($zip, $read_size);

  $binary_data = pack(&#39;a&#39;.$read_size, $buffer);

  @fwrite($fp, $binary_data, $read_size);

  $size -= $read_size;

  }

  $binary_data = pack(&#39;VV&#39;, $header[&#39;crc&#39;], $header[&#39;size&#39;]);

  fwrite($fp, $binary_data,8); fclose($fp);

  $gzp = @gzopen($to.$header[&#39;filename&#39;].&#39;.gz&#39;,&#39;rb&#39;) or die("Cette archive est compress閑");

  if(!$gzp) return(-2);

  $fp = @fopen($to.$header[&#39;filename&#39;],&#39;wb&#39;);

  if(!$fp) return(-1);

  $size = $header[&#39;size&#39;];

  while ($size != 0)

  {

  $read_size = ($size <2048 ? $size : 2048);

  $buffer = gzread($gzp, $read_size);

  $binary_data = pack(&#39;a&#39;.$read_size, $buffer);

  @fwrite($fp, $binary_data, $read_size);

  $size -= $read_size;

  }

  fclose($fp); gzclose($gzp);

  touch($to.$header[&#39;filename&#39;], $header[&#39;mtime&#39;]);

  @unlink($to.$header[&#39;filename&#39;].&#39;.gz&#39;);

  }}

  return true;

  }

  } //ZIP压缩类end


推荐阅读
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 智能制造数据综合分析与应用解决方案
    在智能制造领域,生产数据通过先进的采集设备收集,并利用时序数据库或关系型数据库进行高效存储。这些数据经过处理后,通过可视化数据大屏呈现,为生产车间、生产控制中心以及管理层提供实时、精准的信息支持,助力不同应用场景下的决策优化和效率提升。 ... [详细]
  • 在从深圳返回武汉的旅途中,我购买并阅读了《史玉柱亲述营销智慧》一书。我对史玉柱的兴趣源于对其脑白金广告策略演变的观察,最初是出于对其营销手法的质疑和批评。然而,随着对书中内容的深入理解,逐渐认识到他独特的营销理念和策略背后的深刻洞察力。这本书不仅详细剖析了史玉柱的商业成功之路,还提供了许多实用的营销技巧和经验分享,对于希望提升自身营销能力的读者来说,具有极高的参考价值。 ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • 优化Oracle数据库日志功能的关闭方法与实践
    在优化Oracle数据库日志功能的过程中,关闭不必要的日志记录是一项重要任务。本文探讨了Oracle 11g中日志路径的配置和管理,特别是针对常用的警报日志(alert log)。通过合理配置 `alert_$ORACLE_SID.log` 文件,可以有效减少日志文件的大小和提高系统性能。此外,文章还介绍了如何通过调整参数和使用脚本自动化日志管理,进一步提升数据库的稳定性和维护效率。 ... [详细]
  • 作为一名技术娴熟的编程专家,我通过多年的经验积累和对代码片段的系统总结,几乎无需额外查阅资料。相比之下,普通开发人员在项目开发中通常需要花费10%-20%的时间用于资料查询。我特别注重代码的复用性和高效性,这不仅提高了开发效率,还保证了代码的高质量和可维护性。 ... [详细]
  • 本文探讨了在 Silverlight 应用程序中实现多窗口界面的方法,通过引入浮动窗口组件,增强了应用的交互性和用户体验。该方案详细介绍了技术实现过程,包括窗口管理、布局调整及跨窗口通信机制,为开发者提供了实用的参考。 ... [详细]
  • 如何在PHP中实现链接输出与字符串连接的操作技巧 ... [详细]
  • 本文介绍了一种专为清洁工人设计的自定义文本烟花效果。通过该功能,用户可以输入特定的感谢或祝福语句,系统将生成绚丽的烟花动画,以表达对清洁工人的敬意和感激之情。该特效不仅美观,还能增强用户的互动体验,提升公共场合的氛围。 ... [详细]
  • 在Python 3环境中,当无法连接互联网时,可以通过下载离线模块包来实现模块的安装。具体步骤包括:首先从PyPI网站下载所需的模块包,然后将其传输到目标环境,并使用`pip install`命令进行本地安装。此方法不仅适用于单个模块,还支持依赖项的批量安装,确保开发环境的完整性和一致性。 ... [详细]
  • 多种实现 Windows 定时自动执行任务的专业技巧与方案
    在Windows系统中,实现定时自动执行任务有多种专业技巧和方案。常见的方法包括:使用Windows任务计划程序、开发Windows服务以及利用SQL Server Agent作业。这些方法被广泛应用于各种自动化场景,多数技术人员对此都有所了解。 ... [详细]
  • 在Windows环境中优化提交Spark任务的方法与实践
    在Windows环境中优化提交Spark任务的方法与实践 ... [详细]
  • 初次接触AJAX是在去年,当时主要是通过手动编写客户端代码来实现,还需处理被请求的页面,过程相当繁琐。尽管之前就听说过AJAX.NET,但一直没有机会深入了解。本文将作为初学者的指南,详细介绍AJAX.NET的基本概念、核心功能及其在实际项目中的应用技巧,帮助读者快速上手并掌握这一强大的开发工具。 ... [详细]
  • 本文介绍了如何使用Hive分析用户最长连续登录天数的方法。首先对数据进行排序,然后计算相邻日期之间的差值,接着按用户ID分组并累加连续登录天数,最后求出每个用户的最大连续登录天数。此外,还探讨了该方法在其他领域的应用,如股票市场中最大连续涨停天数的分析。 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
author-avatar
Sophie-wyq_661
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有