使用PHPZip解壓縮文件

WBOY
發布: 2016-07-25 08:44:22
原創
861 人瀏覽過
  1. #
  2. # PHPZip v1.2 由Sext (sext@neud.net) 2002-11-18
  3. #(更改:2003 年) )-03-01)
  4. #
  5. #製作zip文檔
  6. #
  7. #基於“Zip檔案建立類別”,使用zLib
  8. #
  9. #
  10. 類別PHPZip
  11. {
  12. function Zip($dir, $zipfilename)
  13. {
  14. if (@function_exists('gzcompress'))
  15. {
  16. $curdir = getcwd(); 🎜 > if (is_array($dir))
  17. {
  18. $filelist = $dir;
  19. }
  20. else
  21. {
  22. $filelist = $this -> GetFileList($dir) ;
  23. }
  24. if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
  25. else chdir($curdir);
  26. if (count($filelist)>0)
  27. {
  28. foreach($filelist as $filename)
  29. {
  30. if ( is_file($filename))
  31. {
  32. $fd = fopen ($filename, "r");
  33. $content = fread ($fd, filesize ($filename));
  34. fclose ( $ fd);
  35. if (is_array($dir)) $filename = basename($filename);
  36. $this ->; addFile($content, $filename);
  37. }
  38. }
  39. $out = $this ->; file();
  40. chdir($curdir);
  41. $fp = fopen($zipfilename, "w");
  42. fwrite($fp, $out, strlen($out));
  43. fclose($fp);
  44. }
  45. return 1;
  46. }
  47. else return 0;
  48. }
  49. function GetFileList($dir)
  50. {
  51. if (file_exists($dir))
  52. {
  53. $args = func_get_args();
  54. $pref = $args[1];
  55. $dh = opendir($dir ) ) );
  56. while($files = readdir($dh))
  57. {
  58. if (($files!=".")&&($files!=".."))
  59. {
  60. if (is_dir($dir.$files))
  61. {
  62. $curdir = getcwd();
  63. chdir($dir.$files);
  64. $file = array_merge( $檔, $this -> GetFileList("", "$pref$files/"));
  65. chdir($curdir);
  66. }
  67. else $file[]=$pref.$files;
  68. }
  69. }
  70. closedir($dh);
  71. }
  72. return $file;
  73. }
  74. var $datasec = array();
  75. var $ ctrl_dir = array();
  76. var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
  77. var $old_offset = 005x06x00x00x00x00";
  78. var $old_offset = 0;
  79. 0 ) {
  80. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  81. if ($timearray['year'] $timearray['year'] = 1980;
  82. $timearray[' montimearray[' montimearray[' montimearray[' montimearray” '] = 1;
  83. $timearray['mday'] = 1;
  84. $timearray['小時'] = 0;
  85. $timearray['分鐘'] = 0;
  86. $timearray [ '秒'] = 0;
  87. } // 結束if
  88. return (($timearray['year'] - 1980) ($timearray['hours'] > 1);
  89. }// 'unix2DosTime()' 方法結束
  90. /**
  91. * 將「檔案」新增至檔案
  92. *
  93. * @param string 檔案內容
  94. * @param string 檔案中檔案的名稱(可能包含路徑)
  95. * @param 整數目前時間戳
  96. *
  97. * @access public
  98. */
  99. function addFile($data, $name, $time = 0)
  100. {
  101. $ name = str_replace('', '/', $name);
  102. $dtime = dechex($this->unix2DosTime($time));
  103. $hexdtime = 'x' 。 $dtime[6] 。 $dtime[7]
  104. 。 'x' 。 $dtime[4] 。 $dtime[5]
  105. 。 'x' 。 $dtime[2] 。 $dtime[3]
  106. 。 'x' 。 $dtime[0] 。 $dtime[1];
  107. eval('$hexdtime = "' . $hexdtime . '";');
  108. $fr = "x50x4bx03x04";
  109. $fr .= "x14x00" ; // ver 需要擷取
  110. $fr .= "x00x00"; // 產生目的位元標誌
  111. $fr .= "x08x00"; // 壓縮方法
  112. $fr .= $hexdtime; //最後修改時間和日期
  113. // “本地文件頭”段
  114. $unc_len = strlen($data);
  115. $crc = crc32($data);
  116. $zdata = gzcompress ($data);
  117. $c_len = strlen($zdata);
  118. $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // 修正crc 錯誤
  119. $fr .= pack('V', $crc); // crc32
  120. $fr .= pack('V', $c_len); // 壓縮檔案大小
  121. $fr .= pack( 'V', $unc_len); // 未壓縮的檔案大小
  122. $fr .= pack('v', strlen($name)); // 檔案名稱長度
  123. $fr .= pack(' v', 0); // 額外欄位長度
  124. $fr .= $name;
  125. // 「檔案資料」區段
  126. $fr .= $zdata;
  127. // 「資料描述子」段(可選,但如果檔案不是
  128. // 作為檔案)
  129. $fr .= pack('V', $crc); // crc32
  130. $fr . = pack('V', $c_len); // 壓縮檔案大小
  131. $fr .= pack('V', $unc_len); // 未壓縮的檔案大小
  132. // 將此條目加入陣列
  133. $this ->; datasec[] = $fr;
  134. $new_offset = strlen(implode('', $this->datasec));
  135. // 現在加入到中央目錄記錄
  136. $cdrec = " x50x4bx01x02";
  137. $cdrec .= "x00x00"; // 由
  138. 建立的版本$cdrec .= "x14x00"; // 提取所需的版本
  139. $cdrec .= "x00x00"; // 產生目的位元標誌
  140. $cdrec .= "x08x00"; // 壓縮方法
  141. $cdrec .= $hexdtime; // 最後修改時間與日期
  142. $cdrec .= pack('V', $crc); // crc32
  143. $cdrec .= pack('V', $c_len); // 壓縮檔案大小
  144. $cdrec .= pack(' V', $unc_len); // 未壓縮的檔案大小
  145. $cdrec .= pack('v', strlen($name) ); // 檔案名稱長度
  146. $cdrec .= pack('v ', 0 ); // 額外欄位長度
  147. $cdrec .= pack('v', 0 ); // 檔案註解長度
  148. $cdrec .= pack('v', 0 ); // 磁碟編號start
  149. $cdrec .= pack('v', 0 ); // 內部檔案屬性
  150. $cdrec .= pack('V', 32 ); // 外部檔案屬性- 'archive' 位元設定
  151. $cdrec .= pack('V', $this -> old_offset ); // 本地頭部的相對偏移
  152. $this -> old_offset = $new_offset;
  153. $cdrec .= $name;
  154. // 可選額外字段,文件註釋位於此處
  155. // 保存到中央目錄
  156. $this -> ; ctrl_dir[] = $cdrec;
  157. } // 'addFile()' 方法結束
  158. /**
  159. * 轉儲檔案
  160. *
  161. * @return string 壓縮檔案
  162. *
  163. * @access public
  164. */
  165. function file()
  166. {
  167. $data = implode('', $ this -> datasec);
  168. $ctrldir = implode('', $this -> ctrl_dir);
  169. return
  170. $data .
  171. $ctrldir .
  172. $this -> eof_ctrl_dir .
  173. pack('v', sizeof($this -> ctrl_dir)) 。 // 「此磁碟上」的總條目
  174. pack('v', sizeof($this -> ctrl_dir)) . // 條目總數
  175. pack('V', strlen($ctrldir)) . / / 中央目錄的大小
  176. pack('V', strlen($data)) . // 到中央目錄開始的偏移量
  177. "x00x00"; // .zip 檔案註解長度
  178. } / / 'file()' 方法結束
  179. }// end of the 'PHPZip' class
  180. ?>
  181. //使用方法
  182. $z = new PHPZip(); //新建立一個zip的類別
  183. 方法一:
  184. $z -> Zip("", "out1.zip"); //新增目前目錄和子目錄下的所有檔案
  185. 方法二:
  186. $files=array('1.txt','gb.txt');
  187. $files[]='5.txt';
  188. $z -> Zip($files, "out2. zip"); //新增檔案清單
  189. 方法三:
  190. $z -> Zip("/usr/local/sext/", "out3.zip"); //新增指定目錄
  191. ?>
複製程式碼

解壓縮, PHPZip


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板