📄 unzip.lib.php
字号:
fclose($oF);// 2003-12-02 - HB > // Cut end of central directory $aE = explode("\x50\x4b\x05\x06", $vZ); // Easiest way, but not sure if format changes //$this->Comment = substr($aE[1], 18); // Normal way $aP = unpack('x16/v1CL', $aE[1]); $this->Comment = substr($aE[1], 18, $aP['CL']); // Translates end of line from other operating systems $this->Comment = strtr($this->Comment, array("\r\n" => "\n", "\r" => "\n"));// 2003-12-02 - HB < // Cut the entries from the central directory $aE = explode("\x50\x4b\x01\x02", $vZ); // Explode to each part $aE = explode("\x50\x4b\x03\x04", $aE[0]); // Shift out spanning signature or empty entry array_shift($aE); // Loop through the entries foreach ($aE as $vZ) { $aI = array(); $aI['E'] = 0; $aI['EM'] = ''; // Retrieving local file header information $aP = unpack('v1VN/v1GPF/v1CM/v1FT/v1FD/V1CRC/V1CS/V1UCS/v1FNL', $vZ); // Check if data is encrypted $bE = ($aP['GPF'] && 0x0001) ? TRUE : FALSE; $nF = $aP['FNL']; // Special case : value block after the compressed data if ($aP['GPF'] & 0x0008) { $aP1 = unpack('V1CRC/V1CS/V1UCS', substr($vZ, -12)); $aP['CRC'] = $aP1['CRC']; $aP['CS'] = $aP1['CS']; $aP['UCS'] = $aP1['UCS']; $vZ = substr($vZ, 0, -12); } // Getting stored filename $aI['N'] = substr($vZ, 26, $nF); if (substr($aI['N'], -1) == '/') { // is a directory entry - will be skipped continue; } // Truncate full filename in path and filename $aI['P'] = dirname($aI['N']); $aI['P'] = $aI['P'] == '.' ? '' : $aI['P']; $aI['N'] = basename($aI['N']); $vZ = substr($vZ, 26 + $nF); if (strlen($vZ) != $aP['CS']) { $aI['E'] = 1; $aI['EM'] = 'Compressed size is not equal with the value in header information.'; } else { if ($bE) { $aI['E'] = 5; $aI['EM'] = 'File is encrypted, which is not supported from this class.'; } else { switch($aP['CM']) { case 0: // Stored // Here is nothing to do, the file ist flat. break; case 8: // Deflated $vZ = gzinflate($vZ); break; case 12: // BZIP2// 2003-12-02 - HB > if (! extension_loaded('bz2')) { if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { @dl('php_bz2.dll'); } else { @dl('bz2.so'); } } if (extension_loaded('bz2')) {// 2003-12-02 - HB < $vZ = bzdecompress($vZ);// 2003-12-02 - HB > } else { $aI['E'] = 7; $aI['EM'] = "PHP BZIP2 extension not available."; }// 2003-12-02 - HB < break; default: $aI['E'] = 6; $aI['EM'] = "De-/Compression method {$aP['CM']} is not supported."; }// 2003-12-02 - HB > if (! $aI['E']) {// 2003-12-02 - HB < if ($vZ === FALSE) { $aI['E'] = 2; $aI['EM'] = 'Decompression of data failed.'; } else { if (strlen($vZ) != $aP['UCS']) { $aI['E'] = 3; $aI['EM'] = 'Uncompressed size is not equal with the value in header information.'; } else { if (crc32($vZ) != $aP['CRC']) { $aI['E'] = 4; $aI['EM'] = 'CRC32 checksum is not equal with the value in header information.'; } } }// 2003-12-02 - HB > }// 2003-12-02 - HB < } } $aI['D'] = $vZ; // DOS to UNIX timestamp $aI['T'] = mktime(($aP['FT'] & 0xf800) >> 11, ($aP['FT'] & 0x07e0) >> 5, ($aP['FT'] & 0x001f) << 1, ($aP['FD'] & 0x01e0) >> 5, ($aP['FD'] & 0x001f), (($aP['FD'] & 0xfe00) >> 9) + 1980); $this->Entries[] = &new SimpleUnzipEntry($aI); } // end for each entries return $this->Entries; } // end of the 'ReadFile()' method } // end of the 'SimpleUnzip' class /** * Entry of the ZIP file. * * @category phpPublic * @package File-Formats-ZIP * @subpackage Unzip * @version 1.0 * @author Holger Boskugel <vbwebprofi@gmx.de> * @example example.unzip.php Two examples */ class SimpleUnzipEntry { /** * Data of the file entry * * @var mixed * @access public * @see SimpleUnzipEntry() * @since 1.0 */ var $Data = ''; /** * Error of the file entry * * - 0 : No error raised.<BR> * - 1 : Compressed size is not equal with the value in header information.<BR> * - 2 : Decompression of data failed.<BR> * - 3 : Uncompressed size is not equal with the value in header information.<BR> * - 4 : CRC32 checksum is not equal with the value in header information.<BR> * - 5 : File is encrypted, which is not supported from this class.<BR> * - 6 : De-/Compression method ... is not supported.<BR> * - 7 : PHP BZIP2 extension not available. * * @var integer * @access public * @see SimpleUnzipEntry() * @since 1.0 */ var $Error = 0; /** * Error message of the file entry * * @var string * @access public * @see SimpleUnzipEntry() * @since 1.0 */ var $ErrorMsg = ''; /** * File name of the file entry * * @var string * @access public * @see SimpleUnzipEntry() * @since 1.0 */ var $Name = ''; /** * File path of the file entry * * @var string * @access public * @see SimpleUnzipEntry() * @since 1.0 */ var $Path = ''; /** * File time of the file entry (unix timestamp) * * @var integer * @access public * @see SimpleUnzipEntry() * @since 1.0 */ var $Time = 0; /** * Contructor of the class * * @param array Entry datas * @return SimpleUnzipEntry Instanced class * @access public * @since 1.0 */ function SimpleUnzipEntry($in_Entry) { $this->Data = $in_Entry['D']; $this->Error = $in_Entry['E']; $this->ErrorMsg = $in_Entry['EM']; $this->Name = $in_Entry['N']; $this->Path = $in_Entry['P']; $this->Time = $in_Entry['T']; } // end of the 'SimpleUnzipEntry' constructor } // end of the 'SimpleUnzipEntry' class?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -