网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > PHP > PHP技术进阶 > tar/zlib算法实现模块  

tar/zlib算法实现模块

2006-02-27  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

<?
/*
copyright (c) 2001 xinshi allrights reserved

http://xinshi.org
mailto:y10k@963.net
oicq:6795798
*/

Class tarlib {

var $tarname = ';
var $filehand = 0;

function checkcompress() {
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;

if((substr($this->tarname, -7)=='.tar.gz') || (substr($this->tarname, -4)=='.tgz')) { 网管朋友网www_bitscn_net
$_dofunc_open = 'gzopen';
$_dofunc_close = 'gzclose';
$_dofunc_read = 'gzread';
$_dofunc_write = 'gzwrite';
} else {
$_dofunc_open = 'fopen';
$_dofunc_close = 'fclose';
$_dofunc_read = 'fread';
$_dofunc_write = 'fwrite';
网管u家u.bitscn@com

}
}

function mkdir($dir) {
$dirlist = explode('/', $dir);
$depth = count($dirlist)-1;
$dir = $dirlist[0];
for($i = 0; $i<$depth; $i++) {
中国网管联盟bitsCN.com

if(!is_dir($dir)) {
mkdir($dir, 0777);
}
$dir.= '/'.$dirlist[$i+1];
$last = $off;
}
}

function checksum($binary_data_first, $binary_data_last = ') {
网管有家www.bitscn.net

if($binary_data_last==') {
$binary_data_last = $binary_data_first;
}
$checksum = 0;
for ($i=0; $i<148; $i++) {
$checksum += ord(substr($binary_data_first, $i, 1));
网管朋友网www_bitscn_net

}
for ($i=148; $i<156; $i++) {
$checksum += ord(' ');
}
for ($i=156, $j=0; $i<512; $i++, $j++) {

网管有家www.bitscn.net


$checksum += ord(substr($binary_data_last, $j, 1));
}
return $checksum;
}
}

Class tar extends tarlib {

var $filelist = array();

function tar($tarname, $filelist) { 网管u家www.bitscn.net
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;

$this->tarname = $tarname;
$this->checkcompress();
$this->filelist = is_array($filelist) ? $filelist : explode(' ', $filelist);

$this->create(); 网管bitscn_com
}

function create() {
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;

$this->filehand = $_dofunc_open($this->tarname, 'wb');

$this->parse($this->filelist);
$this->footer(); 网管u家www.bitscn.net

$_dofunc_close($this->filehand);
}

function parse($filelist) {
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;

$files = count($filelist);
for($i = 0; $i < $files; $i++) { 中国网管联盟bitsCN.com
$filename = $filelist[$i];
if(is_dir($filename)) {
$dirh = opendir($filename);
readdir($dirh); // '.'
readdir($dirh); // '..'
while($nextfile = readdir($dirh)) { 网管u家bitscn.net
$temp_filelist[] = ($filename != '.') ? $filename.'/'.$nextfile : $nextfile;
}
$this->parse($temp_filelist);
closedir($dirh);
unset($dirh);
unset($temp_filelist); 中国网管论坛bbs.bitsCN.com
unset($nextfile);
continue;
}
$this->parseFile($filename);
}
}

function parseFile($filename) {
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;

$v_info = stat($filename); 网管u家www.bitscn.net
$v_uid = sprintf('%6s ', DecOct($v_info[4]));
$v_gid = sprintf('%6s ', DecOct($v_info[5]));
$v_perms = sprintf('%6s ', DecOct(fileperms($filename))); 网管联盟bitsCN_com
clearstatcache();
$v_size = filesize($filename);
$v_size = sprintf('%11s ', DecOct($v_size));
$v_mtime = sprintf('%11s', DecOct(filemtime($filename)));

$v_binary_data_first = pack('a100a8a8a8a12A12', $filename, $v_perms, $v_uid, $v_gid, $v_size, $v_mtime);
中国网管论坛bbs.bitsCN.com

$v_binary_data_last = pack('a1a100a6a2a32a32a8a8a155a12', ', ', ', ', ', ', ', ', ', ');
$_dofunc_write($this->filehand, $v_binary_data_first, 148);
网管u家bitscn.net


$v_checksum = $this->checksum($v_binary_data_first, $v_binary_data_last);

$v_checksum = sprintf('%6s ', DecOct($v_checksum));
$v_binary_data = pack('a8', $v_checksum);
$_dofunc_write($this->filehand, $v_binary_data, 8); 网管联盟bitsCN_com
$_dofunc_write($this->filehand, $v_binary_data_last, 356);

$fp = fopen($filename, 'rb');
while(($buffer = fread($fp, 512)) <> ') {
$binary_buffer = pack('a512', $buffer); 网管朋友网www_bitscn_net
$_dofunc_write($this->filehand, $binary_buffer);
}
}

function footer() {
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;

$v_binary_data = pack('a512', ');
$_dofunc_write($this->filehand, $v_binary_data); 网管有家www.bitscn.net
}
}


Class tarExtract extends tarlib {

var $extractDir = './extract';

function tarExtract($tarname, $extractDir = './extract') {
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;

$this->tarname = $tarname;
$this->extractDir = $extractDir;

网管联盟bitsCN@com


$this->checkcompress();

if(!is_dir($extractDir)) {
$this->mkdir($extractDir);
}
$this->extract();
}

function extract() {
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;

网管u家www.bitscn.net



$this->filehand = $_dofunc_open($this->tarname, 'rb');
while(($binary_buffer = fread($this->filehand, 512)) <> ') {
$file = $this->parseHeader($binary_buffer); 网管联盟bitsCN@com
if(!$file['name']) continue;
$file['name'] = $this->extractDir.'/'.$file['name'];
$readtimes = floor($file['size']/512);

$this->mkdir($file['name']); 网管u家u.bitscn@com
$fp = fopen($file['name'], 'wb');
for($i = 0; $i<$readtimes; $i++) {
fwrite($fp, $_dofunc_read($this->filehand, 512));
}
if(($lastsize = $file['size']%512)) { 网管u家u.bitsCN.com
fwrite($fp, $_dofunc_read($this->filehand, 512), $lastsize);
}
fclose($fp);
}
$_dofunc_close($this->filehand);
}

function parseHeader($header) {

$checksum = $this->checksum($header); 网管下载dl.bitscn.com
$data = unpack('a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $header);

$file['checksum'] = OctDec(trim($data['checksum']));
/*
if($file['checksum']<>$checksum) {
return false;
}
*/

$file['name'] = trim($data['filename']);

网管网www_bitscn_com


$file['mode'] = OctDec(trim($data['mode']));
$file['uid'] = OctDec(trim($data['uid']));
$file['gid'] = OctDec(trim($data['gid']));

网管论坛bbs_bitsCN_com


$file['size'] = OctDec(trim($data['size']));
$file['mtime'] = OctDec(trim($data['mtime']));
$file['type'] = $data['typeflag']; 网管下载dl.bitscn.com

return $file;
}
}


/*
examples:
1、将xxx.tar解压到mydemo目录(如果是用zlib压缩
过的xxx.tar.gz文件,会自动调用zlib模块解压
-------------------------
require_once 'tarlib.inc.php';

new tarExtract('xxx.tar', 'mydemo');
-------------------------

2、将file目录压缩成为files.tar.gz文件
-------------------------
require_once 'tarlib.inc.php';

new tar('files.tar.gz', 'file');
-------------------------
*/

?>
TAGs   模块   实现   算法   this->   file   _dofunc_write   filehand      
 上一篇:用PHP&XML编制迷你搜索引擎(一)   下一篇:消息持续发送的完整例子,类似socket的那种效果!
tar/zlib算法实现模块 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: