⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tar.class.php

📁 php下的tar文件压缩/解压类 可以使用.tar.gz 或 .tgz来处理gzip压过的tar档案
💻 PHP
📖 第 1 页 / 共 2 页
字号:
				// Add new tar formatted data to tar file contents
				$this->tar_file .= $header;
			}
		}

		// Generate Records for each file, if we have files (We should...)
		if($this->numFiles > 0) {
			foreach($this->files as $key => $information) {
				unset($header);

				// Generate the TAR header for this file
				// Filename, Permissions, UID, GID, size, Time, checksum, typeflag, linkname, magic, version, user name, group name, devmajor, devminor, prefix, end
				$header .= str_pad($information["name"],100,chr(0));
				$header .= str_pad(decoct($information["mode"]),7,"0",STR_PAD_LEFT) . chr(0);
				$header .= str_pad(decoct($information["user_id"]),7,"0",STR_PAD_LEFT) . chr(0);
				$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
	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
	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
	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
	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
	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
	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
	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
	function addFile($filename) {
		// 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
		$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"]		= $checksum;
		$activeFile["user_name"]	= "";
		$activeFile["group_name"]	= "";
		$activeFile["file"]		= $file_contents;

		return true;
	}


	// Remove a file from the tar archive
	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
	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
	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
	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;
	}
}

?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -