- /**
- * Zip file Creation class.
- * Makes zip files.
- *
- * @access Public
- */
- Class ZipFile
- {
- /**
- * Array to store compressed data
- *
- * @public Array $datasec
- */
- Public $datasec = Array ();
- /**
- * Central Directory
- *
- * @public Array $ctrl _dir
- */
- Public $ctrl _dir = Array ();
- /**
- * End of Central directory record
- *
- * @public string $eof _ctrl_dir
- */
- Public $eof _ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
- /**
- * Last offset position
- *
- * @public integer $old _offset
- */
- Public $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 = "\x50\x4b\x03\x04";
- $fr. = "\x14\x00"; Ver needed to extract
- $fr. = "\x00\x00"; Gen Purpose bit Flag
- $fr. = "\x08\x00"; Compression method
- $fr. = $hexdtime; Last mod time and date
- "Local File Header" segment
- $unc _len = strlen ($data);
- $CRC = CRC32 ($data);
- $zdata = gzcompress ($data);
- $zdata = substr (substr ($zdata, 0, strlen ($zdata)-4), 2); Fix CRC Bug
- $c _len = strlen ($zdata);
- $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;
- Now add to Central directory record
- $cdrec = "\x50\x4b\x01\x02";
- $cdrec. = "\x00\x00"; Version made by
- $cdrec. = "\x14\x00"; Version needed to extract
- $cdrec. = "\x00\x00"; Gen Purpose bit Flag
- $cdrec. = "\x08\x00"; 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 + = strlen ($FR);
- $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
- "\x00\x00"; . zip file Comment length
- }//end of the ' file () ' method
- /**
- * A Wrapper of original AddFile Function
- *
- * Created by Hasin Hayder at 29th Jan, 1:29 AM
- *
- * @param array An array of files with Relative/absolute path to being added in Zip File
- *
- * @access Public
- */
- function AddFiles ($files/*only Pass array*/)
- {
- foreach ($files as $file)
- {
- if (Is_file ($file))//directory check
- {
- $data = Implode ("", File ($file));
- $this->addfile ($data, $file);
- }
- }
- }
- /**
- * A Wrapper of original file Function
- *
- * Created by Hasin Hayder at 29th Jan, 1:29 AM
- *
- * @param string Output file name
- *
- * @access Public
- */
- function output ($file)
- {
- $FP =fopen ($file, "w");
- Fwrite ($fp, $this->file ());
- Fclose ($FP);
- }
- }//End of the ' ZipFile ' class
Copy Code |