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 25 PHP
PHP项目开发中最常用的自定义函数整理
Dec 02 PHP
php empty() 检查一个变量是否为空
Nov 10 PHP
PHP登录环节防止sql注入的方法浅析
Jun 30 PHP
php之curl设置超时实例
Nov 03 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
PHP读取XML格式文件的方法总结
Feb 27 PHP
php实现微信模板消息推送
Mar 30 PHP
PHP时间函数使用详解
Mar 21 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
laravel Model 执行事务的实现
Oct 10 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 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分页显示制作详细讲解
2008/11/19 PHP
PHP 八种基本的数据类型小结
2011/06/01 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
javascript代码加载优化方法
2011/01/30 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
JS遍历对象属性的方法示例
2017/01/10 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
Python自动连接ssh的方法
2015/03/07 Python
python中黄金分割法实现方法
2015/05/06 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
常见的软件开发流程有哪些
2015/11/14 面试题
英文版网络工程师求职信
2013/10/28 职场文书
岗位竞聘演讲稿
2014/01/10 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
期末评语大全
2014/05/04 职场文书
环保建议书200字
2014/05/14 职场文书
九一八事变演讲稿
2014/09/05 职场文书
教师岗位职责
2015/02/03 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
学籍证明模板
2015/06/18 职场文书