📄 tar.php
字号:
}
if ($v_result = $this->_openRead()) {
$v_result = $this->_extractList($p_path, $v_list_detail, "complete", $v_list, $p_remove_path);
$this->_close();
}
return $v_result;
}
// }}}
// {{{ _error()
function _error($p_message)
{
// ----- To be completed
$this->raiseError($p_message);
}
// }}}
// {{{ _warning()
function _warning($p_message)
{
// ----- To be completed
$this->raiseError($p_message);
}
// }}}
// {{{ _openWrite()
function _openWrite()
{
if ($this->_compress)
$this->_file = @gzopen($this->_tarname, "w");
else
$this->_file = @fopen($this->_tarname, "w");
if ($this->_file == 0) {
$this->_error("Unable to open in write mode '".$this->_tarname."'");
return false;
}
return true;
}
// }}}
// {{{ _openRead()
function _openRead()
{
if ($this->_compress)
$this->_file = @gzopen($this->_tarname, "rb");
else
$this->_file = @fopen($this->_tarname, "rb");
if ($this->_file == 0) {
$this->_error("Unable to open in read mode '".$this->_tarname."'");
return false;
}
return true;
}
// }}}
// {{{ _openReadWrite()
function _openReadWrite()
{
if ($this->_compress)
$this->_file = @gzopen($this->_tarname, "r+b");
else
$this->_file = @fopen($this->_tarname, "r+b");
if ($this->_file == 0) {
$this->_error("Unable to open in read/write mode '".$this->_tarname."'");
return false;
}
return true;
}
// }}}
// {{{ _close()
function _close()
{
if ($this->_file) {
if ($this->_compress)
@gzclose($this->_file);
else
@fclose($this->_file);
$this->_file = 0;
}
return true;
}
// }}}
// {{{ _cleanFile()
function _cleanFile()
{
_close();
@unlink($this->tarname);
return true;
}
// }}}
// {{{ _writeFooter()
function _writeFooter()
{
if ($this->_file) {
// ----- Write the last 0 filled block for end of archive
$v_binary_data = pack("a512", "");
if ($this->_compress)
@gzputs($this->_file, $v_binary_data);
else
@fputs($this->_file, $v_binary_data);
}
return true;
}
// }}}
// {{{ _addList()
function _addList($p_list, $p_add_dir, $p_remove_dir)
{
$v_result=true;
$v_header = array();
if (!$this->_file) {
$this->_error("Invalid file descriptor");
return false;
}
if (sizeof($p_list) == 0)
return true;
for ($j=0; ($j<count($p_list)) && ($v_result); $j++) {
$v_filename = $p_list[$j];
// ----- Skip the current tar name
if ($v_filename == $this->_tarname)
continue;
if ($v_filename == "")
continue;
if (!file_exists($v_filename)) {
$this->_warning("File '$v_filename' does not exist");
continue;
}
// ----- Add the file or directory header
if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir))
return false;
if (@is_dir($v_filename)) {
if (!($p_hdir = opendir($v_filename))) {
$this->_warning("Directory '$v_filename' can not be read");
continue;
}
$p_hitem = readdir($p_hdir); // '.' directory
$p_hitem = readdir($p_hdir); // '..' directory
while ($p_hitem = readdir($p_hdir)) {
if ($v_filename != ".")
$p_temp_list[0] = $v_filename."/".$p_hitem;
else
$p_temp_list[0] = $p_hitem;
$v_result = $this->_addList($p_temp_list, $p_add_dir, $p_remove_dir);
}
unset($p_temp_list);
unset($p_hdir);
unset($p_hitem);
}
}
return $v_result;
}
// }}}
// {{{ _addFile()
function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir)
{
if (!$this->_file) {
$this->_error("Invalid file descriptor");
return false;
}
if ($p_filename == "") {
$this->_error("Invalid file name");
return false;
}
// ----- Calculate the stored filename
$v_stored_filename = $p_filename;
if ($p_remove_dir != "") {
if (substr($p_remove_dir, -1) != '/')
$p_remove_dir .= "/";
if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir)
$v_stored_filename = substr($p_filename, strlen($p_remove_dir));
}
if ($p_add_dir != "") {
if (substr($p_add_dir, -1) == "/")
$v_stored_filename = $p_add_dir.$v_stored_filename;
else
$v_stored_filename = $p_add_dir."/".$v_stored_filename;
}
if (strlen($v_stored_filename) > 99) {
$this->_warning("Stored file name is too long (max. 99) : '$v_stored_filename'");
fclose($v_file);
return true;
}
if (is_file($p_filename)) {
if (($v_file = @fopen($p_filename, "rb")) == 0) {
$this->_warning("Unable to open file '$p_filename' in binary read mode");
return true;
}
if (!$this->_writeHeader($p_filename, $v_stored_filename))
return false;
while (($v_buffer = fread($v_file, 512)) != "") {
$v_binary_data = pack("a512", "$v_buffer");
if ($this->_compress)
@gzputs($this->_file, $v_binary_data);
else
@fputs($this->_file, $v_binary_data);
}
fclose($v_file);
} else {
// ----- Only header for dir
if (!$this->_writeHeader($p_filename, $v_stored_filename))
return false;
}
return true;
}
// }}}
// {{{ _writeHeader()
function _writeHeader($p_filename, $p_stored_filename)
{
if ($p_stored_filename == "")
$p_stored_filename = $p_filename;
$v_reduce_filename = $this->_pathReduction($p_stored_filename);
$v_info = stat($p_filename);
$v_uid = sprintf("%6s ", DecOct($v_info[4]));
$v_gid = sprintf("%6s ", DecOct($v_info[5]));
$v_perms = sprintf("%6s ", DecOct(fileperms($p_filename)));
clearstatcache();
$v_size = sprintf("%11s ", DecOct(filesize($p_filename)));
$v_mtime = sprintf("%11s", DecOct(filemtime($p_filename)));
if (@is_dir($p_filename))
$v_typeflag = "5";
else
$v_typeflag = "";
$v_linkname = "";
$v_magic = "";
$v_version = "";
$v_uname = "";
$v_gname = "";
$v_devmajor = "";
$v_devminor = "";
$v_prefix = "";
$v_binary_data_first = pack("a100a8a8a8a12A12", $v_reduce_filename, $v_perms, $v_uid, $v_gid, $v_size, $v_mtime);
$v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", $v_typeflag, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, "");
// ----- Calculate the checksum
$v_checksum = 0;
// ..... First part of the header
for ($i=0; $i<148; $i++)
$v_checksum += ord(substr($v_binary_data_first,$i,1));
// ..... Ignore the checksum value and replace it by ' ' (space)
for ($i=148; $i<156; $i++)
$v_checksum += ord(' ');
// ..... Last part of the header
for ($i=156, $j=0; $i<512; $i++, $j++)
$v_checksum += ord(substr($v_binary_data_last,$j,1));
// ----- Write the first 148 bytes of the header in the archive
if ($this->_compress)
@gzputs($this->_file, $v_binary_data_first, 148);
else
@fputs($this->_file, $v_binary_data_first, 148);
// ----- Write the calculated checksum
$v_checksum = sprintf("%6s ", DecOct($v_checksum));
$v_binary_data = pack("a8", $v_checksum);
if ($this->_compress)
@gzputs($this->_file, $v_binary_data, 8);
else
@fputs($this->_file, $v_binary_data, 8);
// ----- Write the last 356 bytes of the header in the archive
if ($this->_compress)
@gzputs($this->_file, $v_binary_data_last, 356);
else
@fputs($this->_file, $v_binary_data_last, 356);
return true;
}
// }}}
// {{{ _readHeader()
function _readHeader($v_binary_data, &$v_header)
{
if (strlen($v_binary_data)==0) {
$v_header[filename] = "";
return true;
}
if (strlen($v_binary_data) != 512) {
$v_header[filename] = "";
$this->_error("Invalid block size : ".strlen($v_binary_data));
return false;
}
// ----- Calculate the checksum
$v_checksum = 0;
// ..... First part of the header
for ($i=0; $i<148; $i++)
$v_checksum+=ord(substr($v_binary_data,$i,1));
// ..... Ignore the checksum value and replace it by ' ' (space)
for ($i=148; $i<156; $i++)
$v_checksum += ord(' ');
// ..... Last part of the header
for ($i=156; $i<512; $i++)
$v_checksum+=ord(substr($v_binary_data,$i,1));
$v_data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $v_binary_data);
// ----- Extract the checksum
$v_header[checksum] = OctDec(trim($v_data[checksum]));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -