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的一个登录的类 [推荐]
Mar 16 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
Dec 02 PHP
php使用fputcsv()函数csv文件读写数据的方法
Jan 06 PHP
php延迟静态绑定实例分析
Feb 08 PHP
php中PDO方式实现数据库的增删改查
May 17 PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
php双层循环(九九乘法表)
Oct 23 PHP
Smarty模板变量与调节器实例详解
Jul 20 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 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数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python中的多线程实例教程
2014/08/27 Python
实例说明Python中比较运算符的使用
2015/05/13 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
处理textarea中的换行和空格
2019/12/12 HTML / CSS
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
初级Java程序员面试题
2016/03/03 面试题
教师找工作推荐信
2013/11/23 职场文书
自我鉴定注意事项
2014/01/19 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
交通事故协议书范本
2014/11/18 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书