php文件压缩之PHPZip类用法实例
本文实例讲述了php文件压缩之PHPZip类用法。分享给大家供大家参考。具体如下:
<?php // //PHPZipv1.2bySext(sext@neud.net) // //Makesziparchive // //Basedon"Zipfilecreationclass",useszLib // // classPHPZip { functionZip($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); elsechdir($curdir); if(count($filelist)>0) { foreach($filelistas$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); } return1; } elsereturn0; } functionGetFileList($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="x50x4bx05x06x00x00x00x00"; var$old_offset=0; /** *ConvertsanUnixtimestamptoafourbyteDOSdateandtimeformat(date *inhightwobytes,timeinlowtwobytesallowingmagnitudecomparison). * *@paramintegerthecurrentUnixtimestamp * *@returnintegerthecurrentdateinafourbyteDOSformat * *@accessprivate */ 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; }//endif return(($timearray['year']-1980)<<25)|($timearray['mon']<<21)|($timearray['mday']<<16)| ($timearray['hours']<<11)|($timearray['minutes']<<5)|($timearray['seconds']>>1); }//endofthe'unix2DosTime()'method /** *Adds"file"toarchive * *@paramstringfilecontents *@paramstringnameofthefileinthearchive(maycontainsthepath) *@paramintegerthecurrenttimestamp * *@accesspublic */ 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="x50x4bx03x04"; $fr.="x14x00";//verneededtoextract $fr.="x00x00";//genpurposebitflag $fr.="x08x00";//compressionmethod $fr.=$hexdtime;//lastmodtimeanddate //"localfileheader"segment $unc_len=strlen($data); $crc=crc32($data); $zdata=gzcompress($data); $c_len=strlen($zdata); $zdata=substr(substr($zdata,0,strlen($zdata)-4),2);//fixcrcbug $fr.=pack('V',$crc);//crc32 $fr.=pack('V',$c_len);//compressedfilesize $fr.=pack('V',$unc_len);//uncompressedfilesize $fr.=pack('v',strlen($name));//lengthoffilename $fr.=pack('v',0);//extrafieldlength $fr.=$name; //"filedata"segment $fr.=$zdata; //"datadescriptor"segment(optionalbutnecessaryifarchiveisnot //servedasfile) $fr.=pack('V',$crc);//crc32 $fr.=pack('V',$c_len);//compressedfilesize $fr.=pack('V',$unc_len);//uncompressedfilesize //addthisentrytoarray $this->datasec[]=$fr; $new_offset=strlen(implode('',$this->datasec)); //nowaddtocentraldirectoryrecord $cdrec="x50x4bx01x02"; $cdrec.="x00x00";//versionmadeby $cdrec.="x14x00";//versionneededtoextract $cdrec.="x00x00";//genpurposebitflag $cdrec.="x08x00";//compressionmethod $cdrec.=$hexdtime;//lastmodtime&date $cdrec.=pack('V',$crc);//crc32 $cdrec.=pack('V',$c_len);//compressedfilesize $cdrec.=pack('V',$unc_len);//uncompressedfilesize $cdrec.=pack('v',strlen($name));//lengthoffilename $cdrec.=pack('v',0);//extrafieldlength $cdrec.=pack('v',0);//filecommentlength $cdrec.=pack('v',0);//disknumberstart $cdrec.=pack('v',0);//internalfileattributes $cdrec.=pack('V',32);//externalfileattributes-'archive'bitset $cdrec.=pack('V',$this->old_offset);//relativeoffsetoflocalheader $this->old_offset=$new_offset; $cdrec.=$name; //optionalextrafield,filecommentgoeshere //savetocentraldirectory $this->ctrl_dir[]=$cdrec; }//endofthe'addFile()'method /** *Dumpsoutfile * *@returnstringthezippedfile * *@accesspublic */ functionfile() { $data=implode('',$this->datasec); $ctrldir=implode('',$this->ctrl_dir); return $data. $ctrldir. $this->eof_ctrl_dir. pack('v',sizeof($this->ctrl_dir)).//total#ofentries"onthisdisk" pack('v',sizeof($this->ctrl_dir)).//total#ofentriesoverall pack('V',strlen($ctrldir)).//sizeofcentraldir pack('V',strlen($data)).//offsettostartofcentraldir "x00x00";//.zipfilecommentlength }//endofthe'file()'method }//endofthe'PHPZip'class ?>
使用方法:
<?php $z=newPHPZip();//新建立一个zip的类 //方法一: $z->Zip("","out1.zip");//添加当前目录和子目录下的所有档案 //方法二: $files=array('1.txt','gb.txt'); $files[]='5.txt'; $z->Zip($files,"out2.zip");//添加文件列表 //方法三: $z->Zip("/usr/local/sext/","out3.zip");//添加指定目录 ?>
希望本文所述对大家的php程序设计有所帮助。