| 
 function addfile($data, $name){ 
        $name     = str_replace('', '/', $name); 
    if(strrchr($name,'/')=='/') return $this->adddir($name); 
        $dtime    = dechex($this->unix2dostime()); 
        $hexdtime = 'x' . $dtime[6] . $dtime[7] 
                  . 'x' . $dtime[4] . $dtime[5] 
                  . 'x' . $dtime[2] . $dtime[3] 
                  . 'x' . $dtime[0] . $dtime[1]; 
        eval('$hexdtime = "' . $hexdtime . '";'); 
        $unc_len = strlen($data); 
        $crc     = crc32($data); 
        $zdata   = gzcompress($data); 
        $c_len   = strlen($zdata); 
        $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2); 
    //新添文件内容格式化: 
        $datastr = "PK"; 
        $datastr .= "";            // ver needed to extract 
        $datastr .= "";            // gen purpose bit flag 
        $datastr .= "";            // compression method 
        $datastr .= $hexdtime;             // last mod time and date 
        $datastr .= pack('v', $crc);             // crc32 
        $datastr .= pack('v', $c_len);           // compressed filesize 
        $datastr .= pack('v', $unc_len);         // uncompressed filesize 
        $datastr .= pack('v', strlen($name));    // length of filename 
        $datastr .= pack('v', 0);                // extra field length 
        $datastr .= $name; 
        $datastr .= $zdata; 
        $datastr .= pack('v', $crc);                 // crc32 
        $datastr .= pack('v', $c_len);               // compressed filesize 
        $datastr .= pack('v', $unc_len);             // uncompressed filesize 
 
    fwrite($this->fp,$datastr); //写入新的文件内容 
    $my_datastr_len = strlen($datastr); 
    unset($datastr); 
    //新添文件目录信息 
        $dirstr = "PK"; 
        $dirstr .= "";                // version made by 
        $dirstr .= "";                // version needed to extract 
        $dirstr .= "";                // gen purpose bit flag 
        $dirstr .= "";                // compression method 
        $dirstr .= $hexdtime;                 // last mod time & date 
        $dirstr .= pack('v', $crc);           // crc32 
        $dirstr .= pack('v', $c_len);         // compressed filesize 
        $dirstr .= pack('v', $unc_len);       // uncompressed filesize 
        $dirstr .= pack('v', strlen($name) ); // length of filename 
        $dirstr .= pack('v', 0 );             // extra field length 
        $dirstr .= pack('v', 0 );             // file comment length 
        $dirstr .= pack('v', 0 );             // disk number start 
        $dirstr .= pack('v', 0 );             // internal file attributes 
        $dirstr .= pack('v', 32 );            // external file attributes - 'archive' bit set 
        $dirstr .= pack('v',$this->datastr_len ); // relative offset of local header 
        $dirstr .= $name; 
    $this->dirstr .= $dirstr; //目录信息 
    $this -> file_count ++; 
    $this -> dirstr_len += strlen($dirstr); 
    $this -> datastr_len += $my_datastr_len; 
    } 
    function adddir($name){ 
       $name = str_replace("", "/", $name); 
       $datastr = "PK "; 
       $datastr .= pack("v",0).pack("v",0).pack("v",0).pack("v", strlen($name) ); 
       $datastr .= pack("v", 0 ).$name.pack("v", 0).pack("v", 0).pack("v", 0); 
       fwrite($this->fp,$datastr); //写入新的文件内容 
       $my_datastr_len = strlen($datastr); 
       unset($datastr); 
       $dirstr = "PK "; 
       $dirstr .= pack("v",0).pack("v",0).pack("v",0).pack("v", strlen($name) ); 
       $dirstr .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 ); 
       $dirstr .= pack("v", 16 ).pack("v",$this->datastr_len).$name; 
       $this->dirstr .= $dirstr; //目录信息 
       $this -> file_count ++; 
       $this -> dirstr_len += strlen($dirstr); 
       $this -> datastr_len += $my_datastr_len; 
    } 
    function createfile(){ 
       //压缩包结束信息,包括文件总数,目录信息读取指针位置等信息 
       $endstr = "PK" . 
          pack('v', $this -> file_count) . 
          pack('v', $this -> file_count) . 
          pack('v', $this -> dirstr_len) . 
          pack('v', $this -> datastr_len) . 
          ""; 
       fwrite($this->fp,$this->dirstr.$endstr); 
       fclose($this->fp); 
    } 
} 
 |