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实现文件上传二法
Oct 09 PHP
PHP分页显示制作详细讲解
Oct 09 PHP
允许phpmyadmin空密码登录的配置方法
May 29 PHP
基于php冒泡排序算法的深入理解
Jun 09 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 PHP
Laravel框架中扩展函数、扩展自定义类的方法
Sep 04 PHP
PHP截取指定图片大小的方法
Dec 10 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
Mar 10 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
Feb 15 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 PHP
PHP7新增函数
Mar 09 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
Laravel 5.4向IoC容器中添加自定义类的方法示例
2017/08/15 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
javascript prototype 原型链
2009/03/12 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
jQuery常见开发技巧详细整理
2013/01/02 Javascript
解析JavaScript中instanceof对于不同的构造器或许都返回true
2013/12/03 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
javascript常用经典算法详解
2017/01/11 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
Python for循环中的陷阱详解
2018/07/13 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
解决django后台管理界面添加中文内容乱码问题
2019/11/15 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
python让函数不返回结果的方法
2020/06/22 Python
Python爬取股票信息,并可视化数据的示例
2020/09/26 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
惠普香港官方商店:HP香港
2019/04/30 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
营业员实习自我鉴定
2013/12/07 职场文书
学习十八大报告感言
2014/02/28 职场文书
小学二年级评语
2014/04/21 职场文书
募捐感谢信
2015/01/22 职场文书
学校会议通知范文
2015/04/15 职场文书
python实现过滤敏感词
2021/05/08 Python
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android