zl程序教程

您现在的位置是:首页 >  后端

当前栏目

PHP压缩文件夹的类代码

PHP代码 文件夹 压缩
2023-06-13 09:14:14 时间
复制代码代码如下:

<?php
/*
$Id:PHPZip.php
*/
classPHPZip{
var$datasec=array();
var$ctrl_dir=array();
var$eof_ctrl_dir="\x50\x4b\x05\x06\x00\x00\x00\x00";
var$old_offset=0;
functionZip($dir,$zipfilename){
if(@function_exists("gzcompress")){
@set_time_limit("0");
$this->openFile($dir,$dir);
$out=$this->filezip();
$fp=fopen($zipfilename,"w");
fwrite($fp,$out,strlen($out));
fclose($fp);
}
}
functionopenFile($path,$zipName){
$temp_path=$path;
$temp_zip_path=$zipName;
$zipDir=$zipName;
if($handle=@opendir($path)){
while(false!==($file=readdir($handle))){
if($file!="."and$file!=".."){
if(ereg("\.",$file.@basename())){
$fd=fopen($path."/".$file,"r");
$fileValue=@fread($fd,1024000);
fclose($fd);
$this->addFile($fileValue,$zipName."/".$file);
}else{
$this->openFile($path."/".$file,$zipName."/".$file);
}
}
}
$zipName=$temp_zip_path;
$path=$temp_path;
closedir($handle);
}
}
functionunix2DosTime($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);
}
functionaddFile($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;
}
functionfilezip(){
$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";
}
}
?>