📄 tar.php
字号:
<?php
/* vim: set ts=4 sw=4: */
// +----------------------------------------------------------------------+
// | PHP version 4.0 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2001 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: Vincent Blavet <vincent@blavet.net> |
// +----------------------------------------------------------------------+
//
// $Id: Tar.php,v 1.1.2.2 2001/10/11 15:00:48 ssb Exp $
require_once 'PEAR.php';
/**
* Creates a (compressed) Tar archive
*
* @author Vincent Blavet <vincent@blavet.net>
* @version $Revision: 1.1.2.2 $
* @package Archive
*/
class Archive_Tar extends PEAR
{
/**
* @var string Name of the Tar
*/
var $_tarname;
/**
* @var boolean if true, the Tar file will be gzipped
*/
var $_compress;
/**
* @var file descriptor
*/
var $_file;
// {{{ constructor
/**
* Archive_Tar Class constructor. This flavour of the constructor only
* declare a new Archive_Tar object, identifying it by the name of the
* tar file.
* If the compress argument is set the tar will be read or created as a
* gzip compressed TAR file.
*
* @param string $p_tarname The name of the tar archive to create
* @param boolean $p_compress if true, the archive will be gezip(ped)
* @access public
*/
function Archive_Tar($p_tarname, $p_compress = false)
{
$this->PEAR();
$this->_tarname = $p_tarname;
if ($p_compress) { // assert zlib extension support
$extname = 'zlib';
if (!extension_loaded($extname)) {
$dlext = (substr(PHP_OS, 0, 3) == 'WIN') ? '.dll' : '.so';
@dl($extname . $dlext);
}
if (!extension_loaded($extname)) {
die("The extension '$extname' couldn't be loaded. ".
'Probably you don\'t have support in your PHP '.
'to this extension');
return false;
}
}
$this->_compress = $p_compress;
}
// }}}
// {{{ destructor
function _Archive_Tar()
{
$this->_close();
$this->_PEAR();
}
// }}}
// {{{ create()
/**
* This method creates the archive file and add the files / directories
* that are listed in $p_filelist.
* If the file already exists and is writable, it is replaced by the
* new tar. It is a create and not an add. If the file exists and is
* read-only or is a directory it is not replaced. The method return
* false and a PEAR error text.
* The $p_filelist parameter can be an array of string, each string
* representing a filename or a directory name with their path if
* needed. It can also be a single string with names separated by a
* single blank.
* See also createModify() method for more details.
*
* @param array $p_filelist An array of filenames and directory names, or a single
* string with names separated by a single blank space.
* @return true on success, false on error.
* @see createModify()
* @access public
*/
function create($p_filelist)
{
return $this->createModify($p_filelist, "", "");
}
// }}}
// {{{ add()
function add($p_filelist)
{
return $this->addModify($p_filelist, "", "");
}
// }}}
// {{{ extract()
function extract($p_path="")
{
return $this->extractModify($p_path, "");
}
// }}}
// {{{ listContent()
function listContent()
{
$v_list_detail = array();
if ($this->_openRead()) {
if (!$this->_extractList("", $v_list_detail, "list", "", "")) {
unset($v_list_detail);
return(0);
}
$this->_close();
}
return $v_list_detail;
}
// }}}
// {{{ createModify()
/**
* This method creates the archive file and add the files / directories
* that are listed in $p_filelist.
* If the file already exists and is writable, it is replaced by the
* new tar. It is a create and not an add. If the file exists and is
* read-only or is a directory it is not replaced. The method return
* false and a PEAR error text.
* The $p_filelist parameter can be an array of string, each string
* representing a filename or a directory name with their path if
* needed. It can also be a single string with names separated by a
* single blank.
* The path indicated in $p_remove_dir will be removed from the
* memorized path of each file / directory listed when this path
* exists. By default nothing is removed (empty path "")
* The path indicated in $p_add_dir will be added at the beginning of
* the memorized path of each file / directory listed. However it can
* be set to empty "". The adding of a path is done after the removing
* of path.
* The path add/remove ability enables the user to prepare an archive
* for extraction in a different path than the origin files are.
* See also addModify() method for file adding properties.
*
* @param array $p_filelist An array of filenames and directory names, or a single
* string with names separated by a single blank space.
* @param string $p_add_dir A string which contains a path to be added to the
* memorized path of each element in the list.
* @param string $p_remove_dir A string which contains a path to be removed from
* the memorized path of each element in the list, when
* relevant.
* @return boolean true on success, false on error.
* @access public
* @see addModify()
*/
function createModify($p_filelist, $p_add_dir, $p_remove_dir="")
{
$v_result = true;
if (!$this->_openWrite())
return false;
if ($p_filelist != "") {
if (is_array($p_filelist))
$v_list = $p_filelist;
elseif (is_string($p_filelist))
$v_list = explode(" ", $p_filelist);
else {
$this->_cleanFile();
$this->_error("Invalid file list");
return false;
}
$v_result = $this->_addList($v_list, "", "");
}
if ($v_result) {
$this->_writeFooter();
$this->_close();
} else
$this->_cleanFile();
return $v_result;
}
// }}}
// {{{ addModify()
/**
* This method add the files / directories listed in $p_filelist at the
* end of the existing archive. If the archive does not yet exists it
* is created.
* The $p_filelist parameter can be an array of string, each string
* representing a filename or a directory name with their path if
* needed. It can also be a single string with names separated by a
* single blank.
* The path indicated in $p_remove_dir will be removed from the
* memorized path of each file / directory listed when this path
* exists. By default nothing is removed (empty path "")
* The path indicated in $p_add_dir will be added at the beginning of
* the memorized path of each file / directory listed. However it can
* be set to empty "". The adding of a path is done after the removing
* of path.
* The path add/remove ability enables the user to prepare an archive
* for extraction in a different path than the origin files are.
* If a file/dir is already in the archive it will only be added at the
* end of the archive. There is no update of the existing archived
* file/dir. However while extracting the archive, the last file will
* replace the first one. This results in a none optimization of the
* archive size.
* If a file/dir does not exist the file/dir is ignored. However an
* error text is send to PEAR error.
* If a file/dir is not readable the file/dir is ignored. However an
* error text is send to PEAR error.
* If the resulting filename/dirname (after the add/remove option or
* not) string is greater than 99 char, the file/dir is
* ignored. However an error text is send to PEAR error.
*
* @param array $p_filelist An array of filenames and directory names, or a single
* string with names separated by a single blank space.
* @param string $p_add_dir A string which contains a path to be added to the
* memorized path of each element in the list.
* @param string $p_remove_dir A string which contains a path to be removed from
* the memorized path of each element in the list, when
* relevant.
* @return true on success, false on error.
* @access public
*/
function addModify($p_filelist, $p_add_dir, $p_remove_dir="")
{
$v_result = true;
if (!@is_file($this->_tarname))
$v_result = $this->createModify($p_filelist, $p_add_dir, $p_remove_dir);
else {
if (is_array($p_filelist))
$v_list = $p_filelist;
elseif (is_string($p_filelist))
$v_list = explode(" ", $p_filelist);
else {
$this->_error("Invalid file list");
return false;
}
$v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir);
}
return $v_result;
}
// }}}
// {{{ extractModify()
/**
* This method extract all the content of the archive in the directory
* indicated by $p_path. When relevant the memorized path of the
* files/dir can be modified by removing the $p_remove_path path at the
* beginning of the file/dir path.
* While extracting a file, if the directory path does not exists it is
* created.
* While extracting a file, if the file already exists it is replaced
* without looking for last modification date.
* While extracting a file, if the file already exists and is write
* protected, the extraction is aborted.
* While extracting a file, if a directory with the same name already
* exists, the extraction is aborted.
* While extracting a directory, if a file with the same name already
* exists, the extraction is aborted.
* While extracting a file/directory if the destination directory exist
* and is write protected, or does not exist but can not be created,
* the extraction is aborted.
* If after extraction an extracted file does not show the correct
* stored file size, the extraction is aborted.
* When the extraction is aborted, a PEAR error text is set and false
* is returned. However the result can be a partial extraction that may
* need to be manually cleaned.
*
* @param string $p_path The path of the directory where the files/dir need to by
* extracted.
* @param string $p_remove_path Part of the memorized path that can be removed if
* present at the beginning of the file/dir path.
* @return boolean true on success, false on error.
* @access public
* @see extractList()
*/
function extractModify($p_path, $p_remove_path)
{
$v_result = true;
$v_list_detail = array();
if ($v_result = $this->_openRead()) {
$v_result = $this->_extractList($p_path, $v_list_detail, "complete", 0, $p_remove_path);
$this->_close();
}
return $v_result;
}
// }}}
// {{{ extractList()
/**
* This method extract from the archive only the files indicated in the
* $p_filelist. These files are extracted in the current directory or
* in the directory indicated by the optional $p_path parameter.
* If indicated the $p_remove_path can be used in the same way as it is
* used in extractModify() method.
* @param array $p_filelist An array of filenames and directory names, or a single
* string with names separated by a single blank space.
* @param string $p_path The path of the directory where the files/dir need to by
* extracted.
* @param string $p_remove_path Part of the memorized path that can be removed if
* present at the beginning of the file/dir path.
* @return true on success, false on error.
* @access public
* @see extractModify()
*/
function extractList($p_filelist, $p_path="", $p_remove_path="")
{
$v_result = true;
$v_list_detail = array();
if (is_array($p_filelist))
$v_list = $p_filelist;
elseif (is_string($p_filelist))
$v_list = explode(" ", $p_filelist);
else {
$this->_error("Invalid string list");
return false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -