📄 tar.php
字号:
if ($v_header[checksum] != $v_checksum) {
$v_header[filename] = "";
// ----- Look for last block (empty block)
if (($v_checksum == 256) && ($v_header[checksum] == 0))
return true;
$this->_error("Invalid checksum : $v_checksum calculated, ".$v_header[checksum]." expected");
return false;
}
// ----- Extract the properties
$v_header[filename] = trim($v_data[filename]);
$v_header[mode] = OctDec(trim($v_data[mode]));
$v_header[uid] = OctDec(trim($v_data[uid]));
$v_header[gid] = OctDec(trim($v_data[gid]));
$v_header[size] = OctDec(trim($v_data[size]));
$v_header[mtime] = OctDec(trim($v_data[mtime]));
$v_header[typeflag] = $v_data[typeflag];
/* ----- All these fields are removed form the header because they do not carry interesting info
$v_header[link] = trim($v_data[link]);
$v_header[magic] = trim($v_data[magic]);
$v_header[version] = trim($v_data[version]);
$v_header[uname] = trim($v_data[uname]);
$v_header[gname] = trim($v_data[gname]);
$v_header[devmajor] = trim($v_data[devmajor]);
$v_header[devminor] = trim($v_data[devminor]);
*/
return true;
}
// }}}
// {{{ _extractList()
function _extractList($p_path, &$p_list_detail, $p_mode, $p_file_list, $p_remove_path)
{
$v_result=true;
$v_nb = 0;
$v_extract_all = true;
$v_listing = false;
if ($p_path == "" || (substr($p_path, 0, 1) != "/" && substr($p_path, 0, 3) != "../" && substr($p_path, 1, 3) != ":\\")) {
$p_path = "./".$p_path;
}
// ----- Look for path to remove format (should end by /)
if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/'))
$p_remove_path .= '/';
$p_remove_path_size = strlen($p_remove_path);
switch ($p_mode) {
case "complete" :
$v_extract_all = TRUE;
$v_listing = FALSE;
break;
case "partial" :
$v_extract_all = FALSE;
$v_listing = FALSE;
break;
case "list" :
$v_extract_all = FALSE;
$v_listing = TRUE;
break;
default :
$this->_error("Invalid extract mode ($p_mode)");
return false;
}
clearstatcache();
While (!($v_end_of_file = ($this->_compress?@gzeof($this->_file):@feof($this->_file))))
{
$v_extract_file = FALSE;
$v_extraction_stopped = 0;
if ($this->_compress)
$v_binary_data = @gzread($this->_file, 512);
else
$v_binary_data = @fread($this->_file, 512);
if (!$this->_readHeader($v_binary_data, $v_header))
return false;
if ($v_header[filename] == "")
continue;
if ((!$v_extract_all) && (is_array($p_file_list))) {
// ----- By default no unzip if the file is not found
$v_extract_file = false;
for ($i=0; $i<sizeof($p_file_list); $i++) {
// ----- Look if it is a directory
if (substr($p_file_list[$i], -1) == "/") {
// ----- Look if the directory is in the filename path
if ((strlen($v_header[filename]) > strlen($p_file_list[$i])) && (substr($v_header[filename], 0, strlen($p_file_list[$i])) == $p_file_list[$i])) {
$v_extract_file = TRUE;
break;
}
}
// ----- It is a file, so compare the file names
elseif ($p_file_list[$i] == $v_header[filename]) {
$v_extract_file = TRUE;
break;
}
}
} else {
$v_extract_file = TRUE;
}
// ----- Look if this file need to be extracted
if (($v_extract_file) && (!$v_listing))
{
if (($p_remove_path != "")
&& (substr($v_header[filename], 0, $p_remove_path_size) == $p_remove_path))
$v_header[filename] = substr($v_header[filename], $p_remove_path_size);
if (($p_path != "./") && ($p_path != "/")) {
while (substr($p_path, -1) == "/")
$p_path = substr($p_path, 0, strlen($p_path)-1);
if (substr($v_header[filename], 0, 1) == "/")
$v_header[filename] = $p_path.$v_header[filename];
else
$v_header[filename] = $p_path."/".$v_header[filename];
}
if (file_exists($v_header[filename])) {
if ((@is_dir($v_header[filename])) && ($v_header[typeflag] == "")) {
$this->_error("File $v_header[filename] already exists as a directory");
return false;
}
if ((is_file($v_header[filename])) && ($v_header[typeflag] == "5")) {
$this->_error("Directory $v_header[filename] already exists as a file");
return false;
}
if (!is_writeable($v_header[filename])) {
$this->_error("File $v_header[filename] already exists and is write protected");
return false;
}
if (filemtime($v_header[filename]) > $v_header[mtime]) {
// To be completed : An error or silent no replace ?
}
}
// ----- Check the directory availability and create it if necessary
elseif (($v_result = $this->_dirCheck(($v_header[typeflag] == "5"?$v_header[filename]:dirname($v_header[filename])))) != 1) {
$this->_error("Unable to create path for $v_header[filename]");
return false;
}
if ($v_extract_file) {
if ($v_header[typeflag] == "5") {
if (!@file_exists($v_header[filename])) {
if (!@mkdir($v_header[filename], 0777)) {
$this->_error("Unable to create directory $v_header[filename]");
return false;
}
}
} else {
if (($v_dest_file = @fopen($v_header[filename], "wb")) == 0) {
$this->_error("Error while opening $v_header[filename] in write binary mode");
return false;
} else {
$n = floor($v_header[size]/512);
for ($i=0; $i<$n; $i++) {
if ($this->_compress)
$v_content = @gzread($this->_file, 512);
else
$v_content = @fread($this->_file, 512);
fwrite($v_dest_file, $v_content, 512);
}
if (($v_header[size] % 512) != 0) {
if ($this->_compress)
$v_content = @gzread($this->_file, 512);
else
$v_content = @fread($this->_file, 512);
fwrite($v_dest_file, $v_content, ($v_header[size] % 512));
}
@fclose($v_dest_file);
// ----- Change the file mode, mtime
@touch($v_header[filename], $v_header[mtime]);
// To be completed
//chmod($v_header[filename], DecOct($v_header[mode]));
}
// ----- Check the file size
if (filesize($v_header[filename]) != $v_header[size]) {
$this->_error("Extracted file $v_header[filename] does not have the correct file size '".filesize($v_filename)."' ($v_header[size] expected). Archive may be corrupted.");
return false;
}
}
} else {
// ----- Jump to next file
if ($this->_compress)
@gzseek($this->_file, @gztell($this->_file)+(ceil(($v_header[size]/512))*512));
else
@fseek($this->_file, @ftell($this->_file)+(ceil(($v_header[size]/512))*512));
}
} else {
// ----- Jump to next file
if ($this->_compress)
@gzseek($this->_file, @gztell($this->_file)+(ceil(($v_header[size]/512))*512));
else
@fseek($this->_file, @ftell($this->_file)+(ceil(($v_header[size]/512))*512));
}
if ($this->_compress)
$v_end_of_file = @gzeof($this->_file);
else
$v_end_of_file = @feof($this->_file);
if ($v_listing || $v_extract_file || $v_extraction_stopped) {
// ----- Log extracted files
if (($v_file_dir = dirname($v_header[filename])) == $v_header[filename])
$v_file_dir = "";
if ((substr($v_header[filename], 0, 1) == "/") && ($v_file_dir == ""))
$v_file_dir = "/";
$p_list_detail[$v_nb++] = $v_header;
}
}
return true;
}
// }}}
// {{{ _append()
function _append($p_filelist, $p_add_dir="", $p_remove_dir="")
{
if ($this->_compress) {
$this->_close();
if (!@rename($this->_tarname, $this->_tarname.".tmp")) {
$this->_error("Error while renaming '".$this->_tarname."' to temporary file '".$this->_tarname.".tmp'");
return false;
}
if (($v_temp_tar = @gzopen($this->_tarname.".tmp", "rb")) == 0) {
$this->_error("Unable to open file '".$this->_tarname.".tmp' in binary read mode");
@rename($this->_tarname.".tmp", $this->_tarname);
return false;
}
if (!$this->_openWrite()) {
@rename($this->_tarname.".tmp", $this->_tarname);
return false;
}
$v_buffer = @gzread($v_temp_tar, 512);
// ----- Read the following blocks but not the last one
if (!@gzeof($v_temp_tar)) {
do{
$v_binary_data = pack("a512", "$v_buffer");
@gzputs($this->_file, $v_binary_data);
$v_buffer = @gzread($v_temp_tar, 512);
} while (!@gzeof($v_temp_tar));
}
if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir))
$this->_writeFooter();
$this->_close();
@gzclose($v_temp_tar);
if (!@unlink($this->_tarname.".tmp")) {
$this->_error("Error while deleting temporary file '".$this->_tarname.".tmp'");
}
return true;
}
// ----- For not compressed tar, just add files before the last 512 bytes block
if (!$this->_openReadWrite())
return false;
$v_size = filesize($this->_tarname);
fseek($this->_file, $v_size-512);
if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir))
$this->_writeFooter();
$this->_close();
return true;
}
// }}}
// {{{ _dirCheck()
function _dirCheck($p_dir)
{
if ((@is_dir($p_dir)) || ($p_dir == ""))
return true;
$p_parent_dir = dirname($p_dir);
if (($p_parent_dir != $p_dir) &&
($p_parent_dir != "") &&
(!$this->_dirCheck($p_parent_dir)))
return false;
if (!@mkdir($p_dir, 0777)) {
$this->_error("Unable to create directory '$p_dir'");
return false;
}
return true;
}
// }}}
// {{{ _pathReduction()
function _pathReduction($p_dir)
{
$v_result = "";
// ----- Look for not empty path
if ($p_dir != "") {
// ----- Explode path by directory names
$v_list = explode("/", $p_dir);
// ----- Study directories from last to first
for ($i=sizeof($v_list)-1; $i>=0; $i--) {
// ----- Look for current path
if ($v_list[$i] == ".") {
// ----- Ignore this directory
// Should be the first $i=0, but no check is done
}
else if ($v_list[$i] == "..") {
// ----- Ignore it and ignore the $i-1
$i--;
}
else if (($v_list[$i] == "") && ($i!=(sizeof($v_list)-1)) && ($i!=0)) {
// ----- Ignore only the double '//' in path,
// but not the first and last '/'
} else {
$v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:"");
}
}
}
return $v_result;
}
// }}}
}
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -