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 ( $fd , filesize ( $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 , $out , strlen ( $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 | ?> |