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 相关文章推荐
一段防盗连的PHP代码
Dec 06 PHP
PHP 和 MySQL 开发的 8 个技巧
Jan 02 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
Jan 07 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
PHP多文件上传实例
Jul 09 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
May 23 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 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 编程请选择正确的文本编辑软件
2006/12/21 PHP
PHP图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
详解Window7 下开发php扩展
2015/12/31 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
基于MooTools的很有创意的滚动条时钟动画
2010/11/14 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
footer定位页面底部(代码分享)
2017/03/07 Javascript
jQuery Jsonp跨域模拟搜索引擎
2017/06/17 jQuery
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
Python实现数值积分方式
2019/11/20 Python
python怎么自定义捕获错误
2020/06/29 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
篮球比赛策划方案
2014/06/05 职场文书
大学生工作自荐书
2014/06/16 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
复活读书笔记
2015/06/29 职场文书
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
关于 Python json中load和loads区别
2021/11/07 Python