Создание rar-архива

SMiX

Новичок
Создание rar-архива

Запрещены функции exec, system, popen и прочее. Нет ли готовой либы, написанной на php?
 

SMiX

Новичок
я был там. Видел либы, которые используют системные вызовы и либы, устанавливаемые рутом :/
 

Coffin

Новичок
PHP:
<?php
/*
 1) Архивируем папку "bla" со всеми файлами в архив out.zip
    require("phpzip.inc.php");
    $z = new PHPZip();
    $z -> Zip("bla", "out.zip");
 2) Архивируем несколько файлов (1.php 2.php 3.php) в архив out2.zip
    require("phpzip.inc.php");
    $z = new PHPZip();
    $files[]="1.php";
    $files[]="2.php";
    $files[]="3.php";
    $z -> Zip($files, "out2.zip");
 3) Архивируем все файлы и все директории из папки home/domain/www в архив out3.zip
    require("phpzip.inc.php");
    $z = new PHPZip();
    $z -> Zip("home/domain/www/", "out3.zip");
*/
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 = "\x50\x4b\x05\x06\x00\x00\x00\x00";
  var $old_offset = 0;
  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;
    }
    return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
  }

  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";
    $fr .= "\x00\x00";
    $fr .= "\x08\x00";
    $fr .= $hexdtime;
    $unc_len = strlen($data);
    $crc = crc32($data);
    $zdata = gzcompress($data);
    $c_len = strlen($zdata);
    $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
    $fr .= pack('V', $crc);
    $fr .= pack('V', $c_len);
    $fr .= pack('V', $unc_len);
    $fr .= pack('v', strlen($name));
    $fr .= pack('v', 0);
    $fr .= $name;
    $fr .= $zdata;
    $fr .= pack('V', $crc);
    $fr .= pack('V', $c_len);
    $fr .= pack('V', $unc_len);
    $this -> datasec[] = $fr;
    $new_offset = strlen(implode('', $this->datasec));
    $cdrec = "\x50\x4b\x01\x02";
    $cdrec .= "\x00\x00";
    $cdrec .= "\x14\x00";
    $cdrec .= "\x00\x00";
    $cdrec .= "\x08\x00";
    $cdrec .= $hexdtime;
    $cdrec .= pack('V', $crc);
    $cdrec .= pack('V', $c_len);
    $cdrec .= pack('V', $unc_len);
    $cdrec .= pack('v', strlen($name) );
    $cdrec .= pack('v', 0 );
    $cdrec .= pack('v', 0 );
    $cdrec .= pack('v', 0 );
    $cdrec .= pack('v', 0 );
    $cdrec .= pack('V', 32 );
    $cdrec .= pack('V', $this -> old_offset );
    $this -> old_offset = $new_offset;
    $cdrec .= $name;
    $this -> ctrl_dir[] = $cdrec;
  }

  function file(){
    $data = implode('', $this -> datasec);
    $ctrldir = implode('', $this -> ctrl_dir);
    return $data .$ctrldir .$this -> eof_ctrl_dir .pack('v', sizeof($this -> ctrl_dir)) .pack('v', sizeof($this -> ctrl_dir)) .pack('V', strlen($ctrldir)) .    pack('V', strlen($data)) ."\x00\x00";
  }
}
?>
 

SMiX

Новичок
Все, нашел http://scripts.protoplex.ru/scripts_show/725.html

-~{}~ 03.08.06 13:01:

Coffin спасибо

-~{}~ 03.08.06 13:18:

Вот такая вот фигня с либой от Coffin'a
Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to allocate 2765818 bytes) in /home2/lsass/public_html/components/com_remository_files/downloads/sterling/ponf.php on line 131
130, 131 и 132 строки это
$this -> datasec[] = $fr;
$new_offset = strlen(implode('', $this->datasec));
$cdrec = "\x50\x4b\x01\x02";
-~{}~ 03.08.06 13:25:

Все проблема решена
 
Сверху