PHP 压缩文件夹的类代码


Posted in PHP onNovember 05, 2009
<?php 
/* 
$Id: PHPZip.php 
*/ 
class PHPZip { 
var $datasec = array(); 
var $ctrl_dir = array(); 
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; 
var $old_offset = 0; 
function Zip($dir, $zipfilename) { 
if (@function_exists('gzcompress')) { 
@set_time_limit("0"); 
$this->openFile($dir,$dir); 
$out = $this -> filezip(); 
$fp = fopen($zipfilename, "w"); 
fwrite($fp, $out, strlen($out)); 
fclose($fp); 
} 
} 
function openFile($path, $zipName) { 
$temp_path = $path; 
$temp_zip_path = $zipName; 
$zipDir = $zipName; 
if ($handle = @opendir($path)) { 
while (false !== ($file = readdir($handle))) { 
if($file !='.' and $file !='..'){ 
if(ereg('\.' , $file.@basename())) { 
$fd = fopen($path.'/'.$file, "r"); 
$fileValue = @fread ($fd, 1024000); 
fclose ($fd); 
$this -> addFile($fileValue, $zipName . '/' . $file); 
} else { 
$this ->openFile($path.'/'.$file, $zipName . '/' . $file); 
} 
} 
} 
$zipName = $temp_zip_path; 
$path = $temp_path; 
closedir($handle); 
} 
} 
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($zdata, 0, strlen($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', 0 ); 
$cdrec .= pack('v', 0 ); 
$cdrec .= pack('v', 0 ); 
$cdrec .= pack('v', 0 ); 
$cdrec .= pack('V', 32 ); 
$cdrec .= pack('V', $this -> old_offset ); 
$this -> old_offset = $new_offset; 
$cdrec .= $name; 
$this -> ctrl_dir[] = $cdrec; 
} 
function filezip() { 
$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"; 
} 
} 
?>
PHP 相关文章推荐
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
Oct 09 PHP
如何使用动态共享对象的模式来安装PHP
Oct 09 PHP
亲密接触PHP之PHP语法学习笔记1
Dec 17 PHP
使用PHP计算两个路径的相对路径
Jun 14 PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 PHP
php中header跳转使用include包含解决参数丢失问题
May 08 PHP
discuz图片顺序混乱解决方案
Jul 29 PHP
PHP的Yii框架中View视图的使用进阶
Mar 29 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 #PHP
网页游戏开发入门教程三(简单程序应用)
Nov 02 #PHP
网页游戏开发入门教程二(游戏模式+系统)
Nov 02 #PHP
初学CAKEPHP 基础教程
Nov 02 #PHP
PHP+MySQL 制作简单的留言本
Nov 02 #PHP
PHP+XML 制作简单的留言本 图文教程
Nov 02 #PHP
php 调用远程url的六种方法小结
Nov 02 #PHP
You might like
php 文件夹删除、php清除缓存程序
2009/08/25 PHP
php去除字符串换行符示例分享
2014/02/13 PHP
js技巧--转义符&quot;\&quot;的妙用
2007/01/09 Javascript
javascript常用对话框小集
2013/09/13 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
JavaScript入门基础
2015/08/12 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
python求pi的方法
2014/10/08 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
pyqt5自定义信号实例解析
2018/01/31 Python
python实现维吉尼亚加密法
2019/03/20 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
利用HTML5的新特点实现图片文件异步上传
2014/05/29 HTML / CSS
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
掌上明珠Java程序员面试总结
2016/02/23 面试题
优秀德育工作者事迹材料
2014/05/07 职场文书
机关搬迁方案
2014/05/18 职场文书
初中生毕业评语
2014/12/29 职场文书
2015年大学生实习评语
2015/03/25 职场文书
导游词之珠海轮廓
2019/10/25 职场文书