0
0
/*
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')) {
$_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';
}
}
function mkdir($dir) {
$dirlist = explode('/', $dir);
$depth = count($dirlist)-1;
$dir = $dirlist[0];
for($i = 0; $i$depth; $i++) {
if(!is_dir($dir)) {
mkdir($dir, 0777);
}
$dir.= '/'.$dirlist[$i+1];
$last = $off;
}
}
function checksum($binary_data_first, $binary_data_last = ') {
if($binary_data_last==') {
$binary_data_last = $binary_data_first;
}
$checksum = 0;
for ($i=0; $i148; $i++) {
$checksum += ord(substr($binary_data_first, $i, 1));
}
for ($i=148; $i156; $i++) {
$checksum += ord(' ');
}
for ($i=156, $j=0; $i512; $i++, $j++) {
$checksum += ord(substr($binary_data_last, $j, 1));
}
return $checksum;
}
}
Class tar extends tarlib {
var $filelist = array();
function tar($tarname, $filelist) {
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;
$this->tarname = $tarname;
$this->checkcompress();
$this->filelist = is_array($filelist) ? $filelist : explode(' ', $filelist);
$this->create();
}
function create() {
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;
$this->filehand = $_dofunc_open($this->tarname, 'wb');
$this->parse($this->filelist);
$this->footer();
$_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++) {
$filename = $filelist[$i];
if(is_dir($filename)) {
$dirh = opendir($filename);
readdir($dirh); // '.'
readdir($dirh); // '..'
while($nextfile = readdir($dirh)) {
$temp_filelist[] = ($filename != '.') ? $filename.'/'.$nextfile : $nextfile;
}
$this->parse($temp_filelist);
closedir($dirh);
unset($dirh);
unset($temp_filelist);
unset($nextfile);
continue;
}
$this->parseFile($filename);
}
}
function parseFile($filename) {
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;
$v_info = stat($filename);
$v_uid = sprintf('%6s ', DecOct($v_info[4]));
$v_gid = sprintf('%6s ', DecOct($v_info[5]));
$v_perms = sprintf('%6s ', DecOct(fileperms($filename)));
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);
$v_binary_data_last = pack('a1a100a6a2a32a32a8a8a155a12', ', ', ', ', ', ', ', ', ', ');
$_dofunc_write($this->filehand, $v_binary_data_first, 148);
$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);
$_dofunc_write($this->filehand, $v_binary_data_last, 356);
$fp = fopen($filename, 'rb');
while(($buffer = fread($fp, 512)) > ') {
$binary_buffer = pack('a512', $buffer);
$_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);
}
}
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;
$this->checkcompress();
if(!is_dir($extractDir)) {
$this->mkdir($extractDir);
}
$this->extract();
}
function extract() {
global $_dofunc_open, $_dofunc_close, $_dofunc_read, $_dofunc_write;
$this->filehand = $_dofunc_open($this->tarname, 'rb');
while(($binary_buffer = fread($this->filehand, 512)) > ') {
$file = $this->parseHeader($binary_buffer);
if(!$file['name']) continue;
$file['name'] = $this->extractDir.'/'.$file['name'];
$readtimes = floor($file['size']/512);
$this->mkdir($file['name']);
$fp = fopen($file['name'], 'wb');
for($i = 0; $i$readtimes; $i++) {
fwrite($fp, $_dofunc_read($this->filehand, 512));
}
if(($lastsize = $file['size']%512)) {
fwrite($fp, $_dofunc_read($this->filehand, 512), $lastsize);
}
fclose($fp);
}
$_dofunc_close($this->filehand);
}
function parseHeader($header) {
$checksum = $this->checksum($header);
$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']);
$file['mode'] = OctDec(trim($data['mode']));
$file['uid'] = OctDec(trim($data['uid']));
$file['gid'] = OctDec(trim($data['gid']));
$file['size'] = OctDec(trim($data['size']));
$file['mtime'] = OctDec(trim($data['mtime']));
$file['type'] = $data['typeflag'];
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');
-------------------------
*/
?>
相关文章
Laravel 中使用 where 子句精准查询数据库特定数据的正确方法
Laravel 中使用 where 子句查询并显示指定分类的数据库记录
WordPress 多站点超大规模管理下管理员登录超时的解决方案
如何将区块链大整数余额按指定小数位转换为可读格式
PHP分页怎么用模板引擎_PHP分页与Smarty等模板结合【教程】
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。
0
2026.02.11
本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。
1
2026.02.11
本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。
3
2026.02.11
本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。
137
2026.02.10
本专题汇总了MC.JS官网入口和网页版快速畅玩方法,提供免安装访问、不同版本(1.8.8、1.12.8)在线体验指南,以及正版网页端操作说明,帮助玩家轻松进入MC.JS世界,实现即时畅玩与高效体验。
80
2026.02.10
本专题汇总了谷歌邮箱网页版的最新登录入口和注册方法,详细提供官方账号快速访问方式、网页版操作教程及安全登录技巧,帮助用户轻松管理Gmail邮箱账户,实现高效、安全的邮箱使用体验。
65
2026.02.10
本专题全面汇总铁路12306订票、退票、改签及候补订单操作技巧,提供车厢座位分布参考、抢票攻略和高铁安检注意事项,帮助新手用户快速掌握高效购票与退改流程,提高出行效率和体验。
78
2026.02.10
本专题面向 AI 与数据科学开发者,系统讲解 TensorFlow 2 框架下深度学习模型的构建、训练、调优与部署。内容包括神经网络基础、卷积神经网络、循环神经网络、优化算法及模型性能提升技巧。通过实战项目演示,帮助开发者掌握从模型设计到上线的完整流程。
1
2026.02.10
本专题讲解 Vue 3 组合式 API 的核心概念与应用技巧,深入分析响应式系统、生命周期管理、组件设计与复用策略。通过完整项目案例,指导前端开发者实现高性能、结构清晰的 Vue 应用,提升开发效率与代码可维护性。
13
2026.02.10
热门下载
相关下载
精品课程
最新文章

