Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198511
  • 博文数量: 264
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 2740
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-03 13:25
文章分类

全部博文(264)

文章存档

2011年(1)

2009年(263)

我的朋友

分类:

2009-06-03 16:06:57

这个完全像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").$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").pack("v").pack("v").pack("v"); 

        
$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($zdata0strlen($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').pack('v');

        
$cdrec .= pack('v').pack('v').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) |
给主人留下些什么吧!~~