PHP压缩类:用于在线压缩文件、文档、目录等,附有使用方法,不想了解类原理的可直接按使用方法调用该类

001 <?php
002 //PHP压缩类代码开始
003 class PHPZip{
004 function Zip($dir$zipfilename)
005 {
006        if (@function_exists('gzcompress'))
007        {
008          $curdir getcwd();
009          if (is_array($dir))
010          {
011             $filelist $dir;
012          }
013          else
014          {
015             $filelist $this -> GetFileList($dir);
016          }
017          if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
018          else chdir($curdir);
019          if (count($filelist)>0)
020          {
021             foreach($filelist as $filename)
022             {
023                    if (is_file($filename))
024                    {
025                      $fd fopen ($filename"r");
026                      $content fread ($fdfilesize ($filename));
027                      fclose ($fd);
028                      if (is_array($dir)) $filename basename($filename);
029                      $this -> addFile($content$filename);
030                    }
031             }
032             $out $this -> file();
033             chdir($curdir);
034             $fp fopen($zipfilename"w");
035             fwrite($fp$outstrlen($out));
036             fclose($fp);
037          }
038          return 1;
039        }
040        else return 0;
041 }
042 function GetFileList($dir)
043 {
044        if (file_exists($dir))
045        {
046          $args = func_get_args();
047          $pref $args[1];
048            $dh = opendir($dir);
049          while($files = readdir($dh))
050          {
051             if (($files!=".")&&($files!=".."))
052             {
053                    if (is_dir($dir.$files))
054                    {
055                      $curdir getcwd();
056                      chdir($dir.$files);
057                      $file array_merge($file$this -> GetFileList("""$pref$files/"));
058                      chdir($curdir);
059                    }
060                    else $file[]=$pref.$files;
061             }
062          }
063          closedir($dh);
064        }
065        return $file;
066 }
067 var $datasec    array();
068 var $ctrl_dir     array();
069 var $eof_ctrl_dir "x50x4bx05x06x00x00x00x00";
070 var $old_offset = 0;
071 function unix2DosTime($unixtime = 0) {
072        $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
073  
074        if ($timearray['year'] < 1980) {
075          $timearray['year'] = 1980;
076          $timearray['mon']     = 1;
077          $timearray['mday'] = 1;
078          $timearray['hours'] = 0;
079          $timearray['minutes'] = 0;
080          $timearray['seconds'] = 0;
081        // end if
082        return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
083             ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
084 }
085 function addFile($data$name$time = 0)
086 {
087        $name     str_replace('''/'$name);
088        $dtime dechex($this->unix2DosTime($time));
089        $hexdtime 'x' $dtime[6] . $dtime[7]
090                'x' $dtime[4] . $dtime[5]
091                'x' $dtime[2] . $dtime[3]
092                'x' $dtime[0] . $dtime[1];
093        eval('$hexdtime = "' $hexdtime '";');
094        $fr "x50x4bx03x04";
095        $fr .= "x14x00";
096        $fr .= "x00x00";
097        $fr .= "x08x00";
098        $fr .= $hexdtime;
099        $unc_len strlen($data);
100        $crc     = crc32($data);
101        $zdata = gzcompress($data);
102        $c_len strlen($zdata);
103        $zdata substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
104        $fr    .= pack('V'$crc);
105        $fr    .= pack('V'$c_len);
106        $fr    .= pack('V'$unc_len);
107        $fr    .= pack('v'strlen($name));
108        $fr    .= pack('v', 0);
109        $fr    .= $name;
110        $fr .= $zdata;
111        $fr .= pack('V'$crc);
112        $fr .= pack('V'$c_len);
113        $fr .= pack('V'$unc_len);
114        $this -> datasec[] = $fr;
115        $new_offset        strlen(implode(''$this->datasec));
116        $cdrec "x50x4bx01x02";
117        $cdrec .= "x00x00";
118        $cdrec .= "x14x00";
119        $cdrec .= "x00x00";
120        $cdrec .= "x08x00";
121        $cdrec .= $hexdtime;
122        $cdrec .= pack('V'$crc);
123        $cdrec .= pack('V'$c_len);
124        $cdrec .= pack('V'$unc_len);
125        $cdrec .= pack('v'strlen($name) );
126        $cdrec .= pack('v', 0 );
127        $cdrec .= pack('v', 0 );
128        $cdrec .= pack('v', 0 );
129        $cdrec .= pack('v', 0 );
130        $cdrec .= pack('V', 32 );
131        $cdrec .= pack('V'$this -> old_offset );
132        $this -> old_offset = $new_offset;
133        $cdrec .= $name;
134        $this -> ctrl_dir[] = $cdrec;
135 }
136 function file()
137 {
138        $data = implode(''$this -> datasec);
139        $ctrldir = implode(''$this -> ctrl_dir);
140        return
141          $data .
142          $ctrldir .
143          $this -> eof_ctrl_dir .
144          pack('v', sizeof($this -> ctrl_dir)) .
145          pack('v', sizeof($this -> ctrl_dir)) .
146          pack('V'strlen($ctrldir)) .
147          pack('V'strlen($data)) .
148          "x00x00";
149 }
150 //PHP压缩类结束

151 ?>



代码帖完了,那么使用这个压缩类呢?下面告诉你三种调用方法: 

01 <?php
02 //不管哪种方法,都需要先新建zip类
03 $z new PHPZip();
04  
05 //方法一:
06 $z -> Zip("""out1.zip"); //添加当前目录和子目录下的所有文件
07  
08 //方法二:
09 $files=array('1.txt','gb.txt');
10 $files[]='5.txt';
11 $z -> Zip($files"out2.zip"); //添加文件列表
12  
13 //方法三:
14 $z -> Zip("/usr/local/sext/""out3.zip"); //添加指定目录
15 ?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值