📄 class.tar.php
字号:
$header .= str_pad(decoct($information["group_id"]),7,"0",STR_PAD_LEFT) . chr(0);
$header .= str_pad(decoct($information["size"]),11,"0",STR_PAD_LEFT) . chr(0);
$header .= str_pad(decoct($information["time"]),11,"0",STR_PAD_LEFT) . chr(0);
$header .= str_repeat(" ",8);
$header .= "0";
$header .= str_repeat(chr(0),100);
$header .= str_pad("ustar",6,chr(32));
$header .= chr(32) . chr(0);
$header .= str_pad($information["user_name"],32,chr(0)); // How do I get a file's user name from PHP?
$header .= str_pad($information["group_name"],32,chr(0)); // How do I get a file's group name from PHP?
$header .= str_repeat(chr(0),8);
$header .= str_repeat(chr(0),8);
$header .= str_repeat(chr(0),155);
$header .= str_repeat(chr(0),12);
// Compute header checksum
$checksum = str_pad(decoct($this->__computeUnsignedChecksum($header)),6,"0",STR_PAD_LEFT);
for($i=0; $i<6; $i++) {
$header[(148 + $i)] = substr($checksum,$i,1);
}
$header[154] = chr(0);
$header[155] = chr(32);
// Pad file contents to byte count divisible by 512
$file_contents = str_pad($information["file"],(ceil($information["size"] / 512) * 512),chr(0));
// Add new tar formatted data to tar file contents
$this->tar_file .= $header . $file_contents;
}
}
// Add 512 bytes of NULLs to designate EOF
$this->tar_file .= str_repeat(chr(0),512);
return true;
}
/**
* Open a TAR file
*
* @param string $filename
* @return bool
**/
function openTAR($filename)
{
// Clear any values from previous tar archives
unset($this->filename);
unset($this->isGzipped);
unset($this->tar_file);
unset($this->files);
unset($this->directories);
unset($this->numFiles);
unset($this->numDirectories);
// If the tar file doesn't exist...
if(!file_exists($filename))
return false;
$this->filename = $filename;
// Parse this file
$this->__readTar();
return true;
}
/**
* Appends a tar file to the end of the currently opened tar file.
*
* @param string $filename
* @return bool
**/
function appendTar($filename)
{
// If the tar file doesn't exist...
if(!file_exists($filename))
return false;
$this->__readTar($filename);
return true;
}
/**
* Retrieves information about a file in the current tar archive
*
* @param string $filename
* @return string FALSE on fail
**/
function getFile($filename)
{
if ( $this->numFiles > 0 ) {
foreach($this->files as $key => $information) {
if($information["name"] == $filename)
return $information;
}
}
return false;
}
/**
* Retrieves information about a directory in the current tar archive
*
* @param string $dirname
* @return string FALSE on fail
**/
function getDirectory($dirname)
{
if($this->numDirectories > 0) {
foreach($this->directories as $key => $information) {
if($information["name"] == $dirname)
return $information;
}
}
return false;
}
/**
* Check if this tar archive contains a specific file
*
* @param string $filename
* @return bool
**/
function containsFile($filename)
{
if ( $this->numFiles > 0 ) {
foreach($this->files as $key => $information) {
if($information["name"] == $filename)
return true;
}
}
return false;
}
/**
* Check if this tar archive contains a specific directory
*
* @param string $dirname
* @return bool
**/
function containsDirectory($dirname)
{
if ( $this->numDirectories > 0 ) {
foreach ( $this->directories as $key => $information ) {
if ( $information["name"] == $dirname ) {
return true;
}
}
}
return false;
}
/**
* Add a directory to this tar archive
*
* @param string $dirname
* @return bool
**/
function addDirectory($dirname)
{
if ( !file_exists($dirname) ) {
return false;
}
// Get directory information
$file_information = stat($dirname);
// Add directory to processed data
$this->numDirectories++;
$activeDir = &$this->directories[];
$activeDir["name"] = $dirname;
$activeDir["mode"] = $file_information["mode"];
$activeDir["time"] = $file_information["time"];
$activeDir["user_id"] = $file_information["uid"];
$activeDir["group_id"] = $file_information["gid"];
$activeDir["checksum"] = $checksum;
return true;
}
/**
* Add a file to the tar archive
*
* @param string $filename
* @param boolean $binary Binary file?
* @return bool
**/
function addFile($filename, $binary = false)
{
// Make sure the file we are adding exists!
if ( !file_exists($filename) ) {
return false;
}
// Make sure there are no other files in the archive that have this same filename
if ( $this->containsFile($filename) ) {
return false;
}
// Get file information
$file_information = stat($filename);
// Read in the file's contents
if (!$binary) {
$fp = fopen($filename, "r");
} else {
$fp = fopen($filename, "rb");
}
$file_contents = fread($fp,filesize($filename));
fclose($fp);
// Add file to processed data
$this->numFiles++;
$activeFile = &$this->files[];
$activeFile["name"] = $filename;
$activeFile["mode"] = $file_information["mode"];
$activeFile["user_id"] = $file_information["uid"];
$activeFile["group_id"] = $file_information["gid"];
$activeFile["size"] = $file_information["size"];
$activeFile["time"] = $file_information["mtime"];
$activeFile["checksum"] = isset($checksum) ? $checksum : '';
$activeFile["user_name"] = "";
$activeFile["group_name"] = "";
$activeFile["file"] = trim($file_contents);
return true;
}
/**
* Remove a file from the tar archive
*
* @param string $filename
* @return bool
**/
function removeFile($filename)
{
if ( $this->numFiles > 0 ) {
foreach ( $this->files as $key => $information ) {
if ( $information["name"] == $filename ) {
$this->numFiles--;
unset($this->files[$key]);
return true;
}
}
}
return false;
}
/**
* Remove a directory from the tar archive
*
* @param string $dirname
* @return bool
**/
function removeDirectory($dirname)
{
if ( $this->numDirectories > 0 ) {
foreach ( $this->directories as $key => $information ) {
if ( $information["name"] == $dirname ) {
$this->numDirectories--;
unset($this->directories[$key]);
return true;
}
}
}
return false;
}
/**
* Write the currently loaded tar archive to disk
*
* @return bool
**/
function saveTar()
{
if ( !$this->filename ) {
return false;
}
// Write tar to current file using specified gzip compression
$this->toTar($this->filename,$this->isGzipped);
return true;
}
/**
* Saves tar archive to a different file than the current file
*
* @param string $filename
* @param bool $useGzip Use GZ compression?
* @return bool
**/
function toTar($filename,$useGzip)
{
if ( !$filename ) {
return false;
}
// Encode processed files into TAR file format
$this->__generateTar();
// GZ Compress the data if we need to
if ( $useGzip ) {
// Make sure we have gzip support
if ( !function_exists("gzencode") ) {
return false;
}
$file = gzencode($this->tar_file);
} else {
$file = $this->tar_file;
}
// Write the TAR file
$fp = fopen($filename,"wb");
fwrite($fp,$file);
fclose($fp);
return true;
}
/**
* Sends tar archive to stdout
*
* @param string $filename
* @param bool $useGzip Use GZ compression?
* @return string
**/
function toTarOutput($filename,$useGzip)
{
if ( !$filename ) {
return false;
}
// Encode processed files into TAR file format
$this->__generateTar();
// GZ Compress the data if we need to
if ( $useGzip ) {
// Make sure we have gzip support
if ( !function_exists("gzencode") ) {
return false;
}
$file = gzencode($this->tar_file);
} else {
$file = $this->tar_file;
}
return $file;
}
}
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -