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 数组入门教程小结
May 20 PHP
PHP 遍历文件实现代码
May 04 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
基于MySQL到MongoDB简易对照表的详解
Jun 03 PHP
web server使用php生成web页面的三种方法总结
Oct 28 PHP
php防止恶意刷新与刷票的方法
Nov 21 PHP
php强制更新图片缓存的方法
Feb 11 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
Dec 10 PHP
php强大的时间转换函数strtotime
Feb 18 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 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
1.PHP简介
2006/10/09 PHP
PHP与javascript的两种交互方式
2006/10/09 PHP
php注销代码(session注销)
2012/05/31 PHP
php读取excel文件的简单实例
2013/08/26 PHP
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
10个实用的PHP正则表达式汇总
2014/10/23 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
js模拟点击事件实现代码
2012/11/06 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
2016/05/10 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
[40:10]2015国际邀请赛全明星表演赛
2015/08/07 DOTA
python进程类subprocess的一些操作方法例子
2014/11/22 Python
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
简单html5代码获取地理位置
2014/03/31 HTML / CSS
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
团队拓展活动方案
2014/08/28 职场文书
钳工实训报告总结
2014/11/04 职场文书
SQL使用复合索引实现数据库查询的优化
2022/05/25 SQL Server
HTML5中的DOCUMENT.VISIBILITYSTATE属性详解
2023/05/07 HTML / CSS