Discuz教程网

PHP 压缩文件夹的类代码

[复制链接]
authicon dly 发表于 2011-9-1 14:32:54 | 显示全部楼层 |阅读模式
代码如下:

  1. <?php
  2. /*
  3. $Id: PHPZip.php
  4. */
  5. class PHPZip {
  6. var $datasec = array();
  7. var $ctrl_dir = array();
  8. var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
  9. var $old_offset = 0;
  10. function Zip($dir, $zipfilename) {
  11. if (@function_exists('gzcompress')) {
  12. @set_time_limit("0");
  13. $this->openFile($dir,$dir);
  14. $out = $this -> filezip();
  15. $fp = fopen($zipfilename, "w");
  16. fwrite($fp, $out, strlen($out));
  17. fclose($fp);
  18. }
  19. }
  20. function openFile($path, $zipName) {
  21. $temp_path = $path;
  22. $temp_zip_path = $zipName;
  23. $zipDir = $zipName;
  24. if ($handle = @opendir($path)) {
  25. while (false !== ($file = readdir($handle))) {
  26. if($file !='.' and $file !='..'){
  27. if(ereg('\.' , $file.@basename())) {
  28. $fd = fopen($path.'/'.$file, "r");
  29. $fileValue = @fread ($fd, 1024000);
  30. fclose ($fd);
  31. $this -> addFile($fileValue, $zipName . '/' . $file);
  32. } else {
  33. $this ->openFile($path.'/'.$file, $zipName . '/' . $file);
  34. }
  35. }
  36. }
  37. $zipName = $temp_zip_path;
  38. $path = $temp_path;
  39. closedir($handle);
  40. }
  41. }
  42. function unix2DosTime($unixtime = 0) {
  43. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  44. if ($timearray['year'] < 1980) {
  45. $timearray['year'] = 1980;
  46. $timearray['mon'] = 1;
  47. $timearray['mday'] = 1;
  48. $timearray['hours'] = 0;
  49. $timearray['minutes'] = 0;
  50. $timearray['seconds'] = 0;
  51. }
  52. return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
  53. ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
  54. }
  55. function addFile($data, $name, $time = 0) {
  56. $name = str_replace('\\', '/', $name);
  57. $dtime = dechex($this->unix2DosTime($time));
  58. $hexdtime = '\x' . $dtime[6] . $dtime[7]
  59. . '\x' . $dtime[4] . $dtime[5]
  60. . '\x' . $dtime[2] . $dtime[3]
  61. . '\x' . $dtime[0] . $dtime[1];
  62. eval('$hexdtime = "' . $hexdtime . '";');
  63. $fr = "\x50\x4b\x03\x04";
  64. $fr .= "\x14\x00";
  65. $fr .= "\x00\x00";
  66. $fr .= "\x08\x00";
  67. $fr .= $hexdtime;
  68. $unc_len = strlen($data);
  69. $crc = crc32($data);
  70. $zdata = gzcompress($data);
  71. $c_len = strlen($zdata);
  72. $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
  73. $fr .= pack('V', $crc);
  74. $fr .= pack('V', $c_len);
  75. $fr .= pack('V', $unc_len);
  76. $fr .= pack('v', strlen($name));
  77. $fr .= pack('v', 0);
  78. $fr .= $name;
  79. $fr .= $zdata;
  80. $fr .= pack('V', $crc);
  81. $fr .= pack('V', $c_len);
  82. $fr .= pack('V', $unc_len);
  83. $this -> datasec[] = $fr;
  84. $new_offset = strlen(implode('', $this->datasec));
  85. $cdrec = "\x50\x4b\x01\x02";
  86. $cdrec .= "\x00\x00";
  87. $cdrec .= "\x14\x00";
  88. $cdrec .= "\x00\x00";
  89. $cdrec .= "\x08\x00";
  90. $cdrec .= $hexdtime;
  91. $cdrec .= pack('V', $crc);
  92. $cdrec .= pack('V', $c_len);
  93. $cdrec .= pack('V', $unc_len);
  94. $cdrec .= pack('v', strlen($name) );
  95. $cdrec .= pack('v', 0 );
  96. $cdrec .= pack('v', 0 );
  97. $cdrec .= pack('v', 0 );
  98. $cdrec .= pack('v', 0 );
  99. $cdrec .= pack('V', 32 );
  100. $cdrec .= pack('V', $this -> old_offset );
  101. $this -> old_offset = $new_offset;
  102. $cdrec .= $name;
  103. $this -> ctrl_dir[] = $cdrec;
  104. }
  105. function filezip() {
  106. $data = implode('', $this -> datasec);
  107. $ctrldir = implode('', $this -> ctrl_dir);
  108. return
  109. $data .
  110. $ctrldir .
  111. $this -> eof_ctrl_dir .
  112. pack('v', sizeof($this -> ctrl_dir)) .
  113. pack('v', sizeof($this -> ctrl_dir)) .
  114. pack('V', strlen($ctrldir)) .
  115. pack('V', strlen($data)) .
  116. "\x00\x00";
  117. }
  118. }
  119. ?>
复制代码





上一篇:PHP实现网站插件机制的方法
下一篇:网页游戏开发入门教程二(游戏模式+系统)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 20:09

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表