这个完全像winrar一样哦class ZipLib{//压缩文件夹
var $datasec = array();
var $ctrl_dir = array();
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $old_offset = 0;
var $dirs = array(".");
function IniVars(){//初始化变量
$this -> datasec = array();
$this -> ctrl_dir = array();
$this -> eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
$this -> old_offset = 0;
$this -> dirs = array(".");
}
function ZipFolder($dir,$zipfilename){//压缩一个文件夹
if(substr($dir,0,2)=="./"){
$dir = substr($dir,2);
}elseif(substr($dir,0,1)=="/"){
$dir = substr($dir,1);
}
$this->AddFolderContent($dir);
$out = $this -> get_file();
$this -> IniVars();
$fp = fopen($zipfilename,"w");
fwrite($fp,$out,strlen($out));
fclose($fp);
}
function AddFolderContent($dir){//添加文件夹中文件列表到 $this->dirs
if(is_dir($dir)){
if(!in_array($dir,$this->dirs)){
$this->add_Dir($dir);
}
$handle = opendir($dir);
while($files = readdir($handle)){
if (($files==".")||($files=="..")) continue;
if(is_dir($dir."/".$files)){
$this->AddFolderContent($dir."/".$files);
}else{
$fp = fopen ($dir."/".$files,"r");
$content = @fread ($fp,filesize($dir."/".$files));
fclose ($fp);
$this->add_File($content,$dir."/".$files);
}
}
closedir($handle);
}
}
function ZipFileArray($files,$zipfilename){//混杂压缩 文件和文件夹并排压缩
if(!is_array($files)){
$files = array($files);
}
for($i=0;$files[$i];$i++){//这儿用的很妙!我看到这种使用方法时,大吃一惊,第一次在这用
$fn = $files[$i];
if(substr($fn,0,2)=="./"){
$fn = substr($fn,2);
}elseif(substr($fn,0,1)=="/"){
$fn = substr($fn,1);
}
if(!in_array(dirname($fn),$this->dirs)){
$this->add_Dir(dirname($fn));
}
if(basename($fn)&&is_file($fn)){
$fp = fopen ($fn, "r");
$data = @fread ($fp,filesize($fn));
fclose ($fp);
$this->add_File($data,$fn);
}elseif(basename($fn)&&is_dir($fn)){
$this->AddFolderContent($fn);
}
}
$out = $this -> get_file();
$this -> IniVars();
$fp = fopen($zipfilename,"w");
fwrite($fp,$out,strlen($out));
fclose($fp);
}
function get_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";
}
function add_dir($name){
$name = str_replace("\\", "/", $name);
$fr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$fr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );
$fr .= pack("v", 0 ).$name.pack("V", 0).pack("V", 0).pack("V", 0);
$this -> datasec[] = $fr;
$new_offset = strlen(implode("", $this->datasec));
$cdrec = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$cdrec .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );
$cdrec .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 );
$ext = "\xff\xff\xff\xff";
$cdrec .= pack("V", 16 ).pack("V", $this -> old_offset ).$name;
$this -> ctrl_dir[] = $cdrec;
$this -> old_offset = $new_offset;
$this -> dirs[] = $name;
}
function add_File($data, $name, $compact = 1){
$name = str_replace('\\', '/', $name);
$dtime = dechex($this->DosTime());
$hexdtime = '\x' . $dtime[6] . $dtime[7].'\x'.$dtime[4] . $dtime[5] . '\x' . $dtime[2] . $dtime[3].'\x'.$dtime[0].$dtime[1];
eval('$hexdtime = "' . $hexdtime . '";');
if($compact){
$fr = "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00".$hexdtime;
}else{
$fr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00".$hexdtime;
}
$unc_len = strlen($data); $crc = crc32($data);
if($compact){
$zdata = gzcompress($data); $c_len = strlen($zdata);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
}else{
$zdata = $data;
}
$c_len=strlen($zdata);
$fr .= pack('V', $crc).pack('V', $c_len).pack('V', $unc_len);
$fr .= pack('v', strlen($name)).pack('v', 0).$name.$zdata;
$fr .= pack('V', $crc).pack('V', $c_len).pack('V', $unc_len);
$this -> datasec[] = $fr;
$new_offset = strlen(implode('', $this->datasec));
if($compact){
$cdrec = "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00";
}else{
$cdrec = "\x50\x4b\x01\x02\x14\x00\x0a\x00\x00\x00\x00\x00";
}
$cdrec .= $hexdtime.pack('V', $crc).pack('V', $c_len).pack('V', $unc_len);
$cdrec .= pack('v', strlen($name) ).pack('v', 0 ).pack('v', 0 );
$cdrec .= pack('v', 0 ).pack('v', 0 ).pack('V', 32 );
$cdrec .= pack('V', $this -> old_offset );
$this -> old_offset = $new_offset;
$cdrec .= $name;
$this -> ctrl_dir[] = $cdrec;
return true;
}
function DosTime() {
$timearray = getdate();
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);
}
}
//例子
$zip = new ZipLib();
$zip->ZipFileArray("./sourceold","./new.zip");
$zip->ZipFolder("./baby","new2.zip");
阅读(151) | 评论(0) | 转发(0) |