За последние 24 часа нас посетили 41903 программиста и 1662 робота. Сейчас ищут 1092 программиста ...

ZIP архивация/разархивация большого количества данных

Тема в разделе "PHP для новичков", создана пользователем Ensiferum, 12 дек 2010.

  1. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Есть две папки. В одной файлов штук 6, в другой под 2к. Первая папка легко архивируется через ZipArchive, вторая не архивируется (status 11, sysstatus 24, затык на пятисотом файле). Пробовал через zipclass от PMA - архив создаётся, но битый. Что делать?
     
  2. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    получить список файлов, разбить на приемлимое кол-во, архивировать из списка в отдельные архивы. не?
     
  3. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
  4. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    нашёл рабочий класс от PMA

    PHP:
    1. <?
    2. class zipfile
    3. {
    4.     var $datasec      = array();
    5.     var $ctrl_dir     = array();
    6.     var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
    7.     var $old_offset   = 0;
    8.     function unix2DosTime($unixtime = 0) {
    9.         $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
    10.         if ($timearray['year'] < 1980) {
    11.             $timearray['year']    = 1980;
    12.             $timearray['mon']     = 1;
    13.             $timearray['mday']    = 1;
    14.             $timearray['hours']   = 0;
    15.             $timearray['minutes'] = 0;
    16.             $timearray['seconds'] = 0;
    17.         }
    18.         return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
    19.                 ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
    20.     }
    21.     function addFile($data, $name, $time = 0)
    22.     {
    23.         $name     = str_replace('\\', '/', $name);
    24.         $dtime    = dechex($this->unix2DosTime($time));
    25.         $hexdtime = '\x' . $dtime[6] . $dtime[7]
    26.                   . '\x' . $dtime[4] . $dtime[5]
    27.                   . '\x' . $dtime[2] . $dtime[3]
    28.                   . '\x' . $dtime[0] . $dtime[1];
    29.         eval('$hexdtime = "' . $hexdtime . '";');
    30.         $fr   = "\x50\x4b\x03\x04";
    31.         $fr   .= "\x14\x00";            
    32.         $fr   .= "\x00\x00";            
    33.         $fr   .= "\x08\x00";            
    34.         $fr   .= $hexdtime;            
    35.         $unc_len = strlen($data);
    36.         $crc     = crc32($data);
    37.         $zdata   = gzcompress($data);
    38.         $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
    39.         $c_len   = strlen($zdata);
    40.         $fr      .= pack('V', $crc);            
    41.         $fr      .= pack('V', $c_len);          
    42.         $fr      .= pack('V', $unc_len);        
    43.         $fr      .= pack('v', strlen($name));    
    44.         $fr      .= pack('v', 0);                
    45.         $fr      .= $name;
    46.         $fr .= $zdata;
    47.         $this -> datasec[] = $fr;
    48.         $cdrec = "\x50\x4b\x01\x02";
    49.         $cdrec .= "\x00\x00";                
    50.         $cdrec .= "\x14\x00";                
    51.         $cdrec .= "\x00\x00";                
    52.         $cdrec .= "\x08\x00";                
    53.         $cdrec .= $hexdtime;                
    54.         $cdrec .= pack('V', $crc);          
    55.         $cdrec .= pack('V', $c_len);        
    56.         $cdrec .= pack('V', $unc_len);      
    57.         $cdrec .= pack('v', strlen($name) );
    58.         $cdrec .= pack('v', 0 );            
    59.         $cdrec .= pack('v', 0 );            
    60.         $cdrec .= pack('v', 0 );            
    61.         $cdrec .= pack('v', 0 );            
    62.         $cdrec .= pack('V', 32 );            
    63.         $cdrec .= pack('V', $this -> old_offset );
    64.         $this -> old_offset += strlen($fr);
    65.         $cdrec .= $name;
    66.         $this -> ctrl_dir[] = $cdrec;
    67.     }
    68.     function file()
    69.     {
    70.         $data    = implode('', $this -> datasec);
    71.         $ctrldir = implode('', $this -> ctrl_dir);
    72.         return
    73.             $data .
    74.             $ctrldir .
    75.             $this -> eof_ctrl_dir .
    76.             pack('v', sizeof($this -> ctrl_dir)) .  
    77.             pack('v', sizeof($this -> ctrl_dir)) .  
    78.             pack('V', strlen($ctrldir)) .          
    79.             pack('V', strlen($data)) .              
    80.             "\x00\x00";              
    81.     }
    82. }
    83. ?>
    Упаковал большой архив довольно бытро. Один минус решения - как партизан всё в себе держит, при очень больших архивах будет переполнение.