Welcome Guest, Not a member yet? Register   Sign In
CI Zip Library
#4

[eluser]John Ashwin[/eluser]
Thanks man.. Smile

I've included your function into the extension. It will come in very useful
for for an upcoming project.

There's another mod as well. Empty timestamps were causing notepad++ and sourceDiff
to crash on me. lol.. It seems winrar and stuffit don't handle missing timestamps
very well, during extraction.

This is the excerpt. The full code is in the attachment.


Code:
/**
     * Mod by : John Christos
     * Add Data to Zip With Dates To Correct no timestamp when
     * extracted by winrar and stuffIt.
     *
     * The extracted files with no timestamp crashed sourceDiff & Notepad++
     * on my system.
     *
     * This fix forces the files to have a timestamp.
     *
     * @access    private
     * @param    string    the file name/path
     * @param    string    the data to be encoded
     * @return    void
     */    
    function _add_data($filepath, $data, $time = 0)
    {
        $filepath = str_replace("\\", "/", $filepath);
        
        // Create TimeStamp
        $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 . '";');
        
        // At this point the Timestamp is in $hexdtime;
        
        

        $uncompressed_size = strlen($data);
        $crc32  = crc32($data);

        $gzdata = gzcompress($data);
        $gzdata = substr($gzdata, 2, -4);
        $compressed_size = strlen($gzdata);
        
    $this->zipdata .=
            "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00" . $hexdtime
            .pack('V', $crc32)
            .pack('V', $compressed_size)
            .pack('V', $uncompressed_size)
            .pack('v', strlen($filepath)) // length of filename
            .pack('v', 0) // extra field length
            .$filepath
            .$gzdata; // "file data" segment
            
            

        $this->directory .=
            "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00\x00\x00\x00\x00"
            .pack('V', $crc32)
            .pack('V', $compressed_size)
            .pack('V', $uncompressed_size)
            .pack('v', strlen($filepath)) // length of filename
            .pack('v', 0) // extra field length
            .pack('v', 0) // file comment length
            .pack('v', 0) // disk number start
            .pack('v', 0) // internal file attributes
            .pack('V', 32) // external file attributes - 'archive' bit set
            .pack('V', $this->offset) // relative offset of local header
            .$filepath;

        $this->offset = strlen($this->zipdata);
        $this->entries++;
        $this->file_num++;
    }
    
    // --------------------------------------------------------------------
    
    
    /**
     * (This function is borrowed from http://drupal.org/node/83253)
     * Converts an Unix timestamp to a four byte DOS date and time format (date
     * in high two bytes, time in low two 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


Messages In This Thread
CI Zip Library - by El Forum - 04-17-2009, 11:41 PM
CI Zip Library - by El Forum - 04-24-2009, 08:46 AM
CI Zip Library - by El Forum - 04-24-2009, 09:26 AM
CI Zip Library - by El Forum - 04-24-2009, 09:46 AM
CI Zip Library - by El Forum - 02-15-2011, 02:07 AM



Theme © iAndrew 2016 - Forum software by © MyBB