// Phpzip v1.2 by Sext (sext@neud.net) // Makes zip archive // Based on "Zip File Creation Class", uses ZLib // // Class Phpzip { function Zip ($dir, $zipfilename) { if (@function_exists (' gzcompress ')) { $curdir = GETCWD (); if (Is_array ($dir)) { $filelist = $dir; } Else { $filelist = $this-Getfilelist ($dir); } if ((!empty ($dir)) && (!is_array ($dir)) && (File_exists ($dir))) chdir ($dir); else ChDir ($curdir); if (count ($filelist) >0) { foreach ($filelist as $filename) { if (Is_file ($filename)) { $FD = fopen ($filename, "R"); $content = Fread ($FD, FileSize ($filename)); Fclose ($FD); if (Is_array ($dir)) $filename = basename ($filename); $this-AddFile ($content, $filename); } } $out = $this file (); ChDir ($curdir); $fp = fopen ($zipfilename, "w"); Fwrite ($fp, $out, strlen ($out)); Fclose ($FP); } return 1; } else return 0; } function Getfilelist ($dir) { if (file_exists ($dir)) { $args = Func_get_args (); $pref = $args [1]; $DH = Opendir ($dir); while ($files = Readdir ($DH)) { if ($files! = ".") && ($files! = "...")) { if (Is_dir ($dir. $files)) { $curdir = GETCWD (); ChDir ($dir. $files); $file = Array_merge ($file, $this, Getfilelist ("", "$pref $files/")); ChDir ($curdir); } else $file []= $pref. $files; } } Closedir ($DH); } return $file; } var $datasec = array (); var $ctrl _dir = Array (); var $eof _ctrl_dir = "x50x4bx05x06x00x00x00x00"; var $old _offset = 0; /** * Converts a Unix timestamp to a four byte DOS date and time format (date * In high and bytes, time in low, bytes allowing magnitude comparison). * * @param integer The current Unix timestamp * * @return Integer The current date in a four byte DOS format * * @access Private */ function Unix2dostime ($unixtime = 0) { $timearray = ($unixtime = = 0)? GETDATE (): getdate ($unixtime); if ($timearray [' Year '] < 1980) { $timearray [' year '] = 1980; $timearray [' mon '] = 1; $timearray [' mday '] = 1; $timearray [' hours '] = 0; $timearray [' minutes '] = 0; $timearray [' seconds '] = 0; }//End If Return (($timearray [' Year ']-1980) << 25) | ($timearray [' mon '] << 21) | ($timearray [' Mday '] << 16) | ($timearray [' hours '] << 11) | ($timearray [' minutes '] << 5) | ($timearray [' seconds '] >> 1); }//End of the ' unix2dostime () ' method /** * Adds "file" to archive * * @param string file contents * @param string name of the the file in the archive (may contains the path) * @param integer The current timestamp * * @access Public */ function AddFile ($data, $name, $time = 0) { $name = Str_replace (', '/', $name); $dtime = Dechex ($this->unix2dostime ($time)); $hexdtime = ' x '. $dtime [6]. $dtime [7] . ' X '. $dtime [4]. $dtime [5] . ' X '. $dtime [2]. $dtime [3] . ' X '. $dtime [0]. $dtime [1]; Eval (' $hexdtime = '. $hexdtime. '";'); $FR = "x50x4bx03x04"; $fr. = "x14x00"; Ver needed to extract $fr. = "x00x00"; Gen Purpose bit Flag $fr. = "x08x00"; Compression method $fr. = $hexdtime; Last mod time and date "Local File Header" segment $unc _len = strlen ($data); $CRC = CRC32 ($data); $zdata = gzcompress ($data); $c _len = strlen ($zdata); $zdata = substr (substr ($zdata, 0, strlen ($zdata)-4), 2); Fix CRC Bug $fr. = Pack (' V ', $CRC); Crc32 $fr. = Pack (' V ', $c _len); Compressed FileSize $fr. = Pack (' V ', $unc _len); Uncompressed FileSize $fr. = Pack (' V ', strlen ($name)); Length of filename $fr. = Pack (' V ', 0); Extra field length $fr. = $name; "File Data" segment $fr. = $zdata; "Data Descriptor" segment (optional but necessary if archive are not served as file) $fr. = Pack (' V ', $CRC); Crc32 $fr. = Pack (' V ', $c _len); Compressed FileSize $fr. = Pack (' V ', $unc _len); Uncompressed FileSize Add this entry to array $this-datasec[] = $FR; $new _offset = strlen (Implode (", $this->datasec)); Now add to Central directory record $cdrec = "x50x4bx01x02"; $cdrec. = "x00x00"; Version made by $cdrec. = "x14x00"; Version needed to extract $cdrec. = "x00x00"; Gen Purpose bit Flag $cdrec. = "x08x00"; Compression method $cdrec. = $hexdtime; Last MoD time & date $cdrec. = Pack (' V ', $CRC); Crc32 $cdrec. = Pack (' V ', $c _len); Compressed FileSize $cdrec. = Pack (' V ', $unc _len); Uncompressed FileSize $cdrec. = Pack (' V ', strlen ($name)); Length of filename $cdrec. = Pack (' V ', 0); Extra field length $cdrec. = Pack (' V ', 0); File Comment length $cdrec. = Pack (' V ', 0); Disk number Start $cdrec. = Pack (' V ', 0); Internal file attributes $cdrec. = Pack (' V ', 32); External file attributes-' archive ' bit set $cdrec. = Pack (' V ', $this-old_offset); Relative offset of local header $this-old_offset = $new _offset; $cdrec. = $name; Optional extra field, file comment goes here Save to Central directory $this-ctrl_dir[] = $cdrec; }//End of the ' AddFile () ' method /** * Dumps out file * * @return String The zipped file * * @access Public */ function file () { $data = Implode (", $this-datasec); $ctrldir = Implode (", $this-Ctrl_dir); Return $data. $ctrldir. Eof_ctrl_dir, $this. Pack (' V ', sizeof ($this-Ctrl_dir)). Total # of Entries "on this disk" Pack (' V ', sizeof ($this-Ctrl_dir)). Total # of entries overall Pack (' V ', strlen ($ctrldir)). Size of Central Dir Pack (' V ', strlen ($data)). Offset to start of the central Dir "X00x00"; . zip file Comment length }//end of the ' file () ' method }//End of the ' Phpzip ' class ?> |