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 相关文章推荐
用Flash图形化数据(一)
Oct 09 PHP
eWebEditor v3.8 商业完整版 (PHP)
Dec 06 PHP
php AJAX实例根据邮编自动完成地址信息
Nov 23 PHP
PHP APC配置文件2套和参数详解
Jun 11 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
Jun 19 PHP
解决cPanel无法安装php5.2.17
Jun 22 PHP
PHP扩展开发入门教程
Feb 26 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
Dec 27 PHP
PHP简单实现解析xml为数组的方法
May 02 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 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
wordpress之wp-settings.php
2007/08/17 PHP
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
Javascript动画的实现原理浅析
2015/03/02 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
Vue.js表单控件实践
2016/10/27 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
javascript History对象原理解析
2020/02/17 Javascript
实现一个Vue自定义指令懒加载的方法示例
2020/06/04 Javascript
python字符串替换的2种方法
2014/11/30 Python
详解Python发送邮件实例
2016/01/10 Python
python嵌套字典比较值与取值的实现示例
2017/11/03 Python
对numpy中array和asarray的区别详解
2018/04/17 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
String和StringBuffer的区别
2015/08/13 面试题
开业庆典策划方案
2014/02/18 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
质量安全标语
2014/06/07 职场文书
重阳节标语大全
2014/10/07 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
运动会广播稿20字
2015/08/19 职场文书
python基础之文件操作
2021/10/24 Python