欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

小弟我有这么一个压缩文件夹的类,求更快的压缩方法

程序员文章站 2024-01-26 13:23:42
...
我有这么一个压缩文件夹的类,求更快的压缩方法


class PHPZip
{

var $datasec = array();
var $ctrl_dir = array();
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $old_offset = 0;

function Zip($dir, $zipfilename)
{
if(@function_exists('gzcompress'))
{
@set_time_limit("0");
$this->openFile($dir, $dir);
$out = $this->filezip();
$fp = fopen($zipfilename, "w");
$fwrite = fwrite($fp, $out, strlen($out));
fclose($fp);
if($fwrite == true)
{
return true;
}
}
return false;
}

function openFile($path, $zipName)
{
$temp_path = $path;
$temp_zip_path = $zipName;
$zipDir = $zipName;

if($handle = @opendir($path))
{
while(($file = readdir($handle))!==false)
{
$sub_dir = $path . DIRECTORY_SEPARATOR . $file; //构建子目录路径
if($file == '.' || $file == '..') {
continue;
}else if(is_dir($sub_dir)) { //如果是目录,进行递归
$this->openFile($path . '/' . $file, $zipName . '/' . $file);
}
else{
$fd = fopen($path . '/' . $file, "r");
$fileValue = @fread($fd, 1024000);
if($fd)
fclose($fd);
$this->addFile($fileValue, $zipName . '/' . $file);
}
}
$zipName = $temp_zip_path;
$path = $temp_path;
closedir($handle);
}
}

function unix2DosTime($unixtime = 0)
{
$timearray = ($unixtime==0) ? getdate() : getdate($unixtime);
if($timearray['year'] {
$timearray['year'] = 1980;
$timearray['mon'] = 1;
$timearray['mday'] = 1;
$timearray['hours'] = 0;
$timearray['minutes'] = 0;
$timearray['seconds'] = 0;
}
return (($timearray['year']-1980) ($timearray['hours']>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 filezip()
{
$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";
}

}

//我有个文件夹,大概30M,600个文件,打包时间超过半个小时候以上,谁有更好更快的打包方法啊,不胜感谢了。


------解决方案--------------------
php 提供有 zip 扩展,为什么不用?
小弟我有这么一个压缩文件夹的类,求更快的压缩方法

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频