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之COOKIE支持详解
Sep 20 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
php解压文件代码实现php在线解压
Feb 13 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
Yii2.0高级框架数据库增删改查的一些操作
Nov 16 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
Yii2实现同时搜索多个字段的方法
Aug 10 PHP
微信公众平台开发(五) 天气预报功能开发
Dec 03 PHP
在laravel中使用Symfony的Crawler组件分析HTML
Jun 19 PHP
简单实用的PHP文本缓存类实例
Mar 22 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
Apr 09 PHP
Yii框架核心组件类实例详解
Aug 06 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
实现树状结构的两种方法
2006/10/09 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
初识javascript 文档碎片
2010/07/13 Javascript
javascript分页代码(当前页码居中)
2012/09/20 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
python编程培训 python培训靠谱吗
2018/01/17 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
优秀共产党员先进事迹
2014/01/27 职场文书
中学教师教育感言
2014/02/21 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
人力资源部岗位职责
2015/02/11 职场文书
教师自荐信范文
2015/03/06 职场文书
如何写好闭幕词
2019/04/02 职场文书
Docker安装MySql8并远程访问的实现
2022/07/07 Servers