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读取EXCEL文件 php excelreader读取excel文件
Dec 06 PHP
APACHE的AcceptPathInfo指令使用介绍
Jan 18 PHP
深入PHP数据加密详解
Jun 18 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 PHP
PHP session_start()问题解疑(详细介绍)
Jul 05 PHP
php操作xml
Oct 27 PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
推荐几个开源的微信开发项目
Dec 28 PHP
Codeigniter检测表单post数据的方法
Mar 21 PHP
PHP Reflection API详解
May 12 PHP
Django中的cookie与session操作实例代码
Aug 17 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
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
JavaScript中匿名函数用法实例
2015/03/23 Javascript
Javascript函数的参数
2015/07/16 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
jQuery条件分页 代替离线查询(附代码)
2017/08/17 jQuery
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
python判断字符串是否包含子字符串的方法
2015/03/24 Python
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
Python3 socket同步通信简单示例
2017/06/07 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
python中 chr unichr ord函数的实例详解
2017/08/06 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
Python 如何测试文件是否存在
2020/07/31 Python
python如何操作mysql
2020/08/17 Python
小学生操行评语大全
2014/04/22 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
安全生产月标语
2014/10/07 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
网站出售协议书范文
2014/10/10 职场文书
优秀班集体申报材料
2014/12/25 职场文书
安全守法证明
2015/06/23 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python