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

全部博文(264)

文章存档

2011年(1)

2009年(263)

我的朋友

分类:

2009-06-03 16:05:34

这个全是类的





class ZipAllFloder{

    var 
$cachelist = array();

    var 
$datasec      = array();  

    var 
$ctrl_dir     = array();  

    var 
$eof_ctrl_dir "\x50\x4b\x05\x06\x00\x00\x00\x00";  

    var 
$old_offset   0;  

    

    function 
StartWork($dir){

        
$result $this->GetList($dir);

        
$this->ClearCache();

        return 
$result;

    } 

    function 
ReadAndExport($filelist,$zipfilename){  

        if (
count($filelist)>0){  

            foreach(
$filelist as $filename){  

                if (
is_file($filename)){  

                    
$fp fopen ($filename"r");  

                    
$content = @fread ($fp,filesize($filename));  

                    
fclose ($fp);  

                    
$filename basename($filename);  

                    
$this -> addFile($content$filename);  

                }  

            }  

        }else{

            
$this -> addFile("This folder have none a single file!","nofile.log");

        }

        
$out $this -> outfile(); 

        
$this -> IniVars();

        
$fp fopen($zipfilename,"w");  

        
fwrite($fp,$out,strlen($out));  

        
fclose($fp);

        
$this -> cachelist[] = $zipfilename

    }

    function 
GetList($dir){  

        if (
file_exists($dir)){  

            
$handle opendir($dir); 

            while(
$files readdir($handle)){  

                if ((
$files==".")||($files=="..")) continue; 

                if(
is_dir($dir."/".$files)){

                    
$this -> GetList($dir."/".$files);

                }else{

                    
$filelist[] = $dir."/".$files

                } 

            }  

            
closedir($handle);

            
$zipfilename dirname($dir)."/[FOLDER]".basename($dir).".zip";

            
$this -> ReadAndExport($filelist,$zipfilename);

        }  

        return 
$zipfilename;  

    }  

    function 
ClearCache(){

        if(
$num count($this ->cachelist)){

            for(
$i=0;$i<$num-1;$i++){

                @
unlink($this ->cachelist[$i]);

            }

        }

    }

    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;

    }

    function 
unix2DosTime($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);  

    }

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

        
$cdrec .= pack('v');

        
$cdrec .= pack('v');

        
$cdrec .= pack('v');

        
$cdrec .= pack('V'32 );

        
$cdrec .= pack('V'$this -> old_offset );

        
$this -> old_offset $new_offset;  

        
$cdrec .= $name;  

        
$this -> ctrl_dir[] = $cdrec;  

    }

    function 
outfile(){  

        
$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";

    }

}



$zip = new ZipAllFloder();

$str $zip->StartWork("./baby");

echo 
$str;

?>


这个是把非我写的核心类文件独立出来了

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;  

    

    function 
unix2DosTime($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);  

    }

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

        
$cdrec .= pack('v');

        
$cdrec .= pack('v');

        
$cdrec .= pack('v');

        
$cdrec .= pack('V'32 );

        
$cdrec .= pack('V'$this -> old_offset );

        
$this -> old_offset $new_offset;  

        
$cdrec .= $name;  

        
$this -> ctrl_dir[] = $cdrec;  

    }

    function 
outfile(){  

        
$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";

    }

}



$cachelist = array();

function 
ReadAndExport($filelist,$zipfilename){ 

    global 
$cachelist

    
$zip = new ZipLib();

    if (
count($filelist)>0){  

        foreach(
$filelist as $filename){  

            if (
is_file($filename)){  

                
$fp fopen ($filename"r");  

                
$content = @fread ($fp,filesize($filename));  

                
fclose ($fp);  

                
$filename basename($filename);  

                
$zip -> addFile($content$filename);  

            }  

        }  

    }else{

        
$zip -> addFile("This folder have none a single file!","nofile.log");

    }

    
$out $zip -> outfile();  

    
$fp fopen($zipfilename,"w");  

    
fwrite($fp,$out,strlen($out));  

    
fclose($fp);

    
$cachelist[] = $zipfilename

}

function 
GetList($folder){  

    if (
file_exists($folder)){  

        
$handle opendir($folder);

        
$gonext 1;

        while(
$files readdir($handle)){  

            if ((
$files==".")||($files=="..")) continue; 

            if(
is_dir($folder."/".$files)){

                
//$filelist[] = 

                
GetList($folder."/".$files);

            }else{

                
$filelist[] = $folder."/".$files

            } 

        }  

        
closedir($handle);

        if(
$gonext){

            
$zipfilename dirname($folder)."/[FOLDER]".basename($folder).".zip";

            
ReadAndExport($filelist,$zipfilename);

        }

    }  

    return 
$zipfilename;  

}  

function 
ClearCache(){

    global 
$cachelist;

    if(
$num count($cachelist)){

        for(
$i=0;$i<$num-1;$i++){

            @
unlink($cachelist[$i]);

        }

    }

}

function 
StartWork($folder){

    
$result GetList($folder);

    
ClearCache();

    return 
$result;



$list StartWork("./baby");

echo 
$list."";

?>
阅读(203) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~