我目前正在使用PHP的Archive-Tar Pear extension
将一组文件添加到Tar Archive中。
这些文件存储在具有额外扩展名的文件管理器中 例如
filename.tgz.104850209.t or filename2.doc.2154395.t
我想在添加文件时删除这个额外的扩展程序,以便我的Tar Archive会有文件:filename.tgz和filename2.doc
在添加到存档之前,是否有办法在不必复制/重命名源文件的情况下执行此操作?
谢谢, 标记
答案 0 :(得分:2)
Archive_Tar
在其最新版本中尚未支持开箱即用的此类功能。部分功能位于_addFile()
,另一部分位于_addString()
。
最简单的可能是从Archive_Tar
扩展并代理所有公共的_writeHeaderBlock()
调用,在filename参数上应用地图,以便在写入标题时重命名。
class Patched_Archive_Tar extends Archive_Tar
{
var $renameMap = array();
function _writeHeaderBlock($p_filename, $p_size, $p_mtime=0, $p_perms=0,
$p_type='', $p_uid=0, $p_gid=0)
{
return parent::_writeHeaderBlock($this->_translateFilename($p_filename),
$p_size, $p_mtime=0, $p_perms=0,
$p_type='', $p_uid=0, $p_gid=0);
}
function _translateFilename($orignal)
{
$map = $this->renameMap;
if (isset($map[$orignal])) {
return $map[$orignal];
}
return $original;
}
}
用法:
$obj = new Patched_Archive_Tar('dummy.tar'); // name of archive
$files = array('mystuff/ad.gif',
'mystuff/alcon.doc.t',
'mystuff/alcon.xls.t'); // files to store in archive
$obj->renameMap = array(
'mystuff/alcon.doc.t' => 'mystuff/alcon.doc',
'mystuff/alcon.xls.t' => 'mystuff/alcon.xls',
) // files to rename
if ($obj->create($files)) {
echo 'Created successfully!';
} else {
echo 'Error in file creation';
}
这很快又脏,但希望很有用。为了更好地看到我在开头_addFile()
和_addString()
注意到的功能,你基本上想要另一个能够通过指定文件名来添加文件(与_addFile()
一样)的功能(如与_addString()
)。
答案 1 :(得分:0)
试图编辑@hakre的答案,但同行评审员却没有。
要回答@ user2248522的评论,我重写了该类以使用_writeHeader。此外,我为任何Windows用户添加了一个块,并修复了一些拼写错误。
class Patched_Archive_Tar extends Archive_Tar
{
var $renameMap = array();
function _writeHeader($p_filename, $p_stored_filename)
{
return parent::_writeHeader($p_filename,
$this->_translateFilename($p_stored_filename));
}
function _translateFilename($orignal)
{
$map = $this->renameMap;
if (isset($map[$original])) {
return $map[$original];
}
//Need alter our map array to match the altered original on WIN systems
if (defined('OS_WINDOWS') && OS_WINDOWS) {
//Check for a proper array
if (!is_array($map)) return $original;
//Check each replacement rule
foreach($map as $needle => $replacement) {
if ($this->_translateWinPath($needle, true) == $original) {
return $replacement;
} //if()
} //foreach()
} //if()
return $original;
}
}
用法:
$obj = new Patched_Archive_Tar('dummy.tar'); // name of archive
$files = array('mystuff/ad.gif',
'mystuff/alcon.doc.t',
'mystuff/alcon.xls.t'); // files to store in archive
$obj->renameMap = array(
'mystuff/alcon.doc.t' => 'mystuff/alcon.doc',
'mystuff/alcon.xls.t' => 'mystuff/alcon.xls',
) // files to rename
if ($obj->create($files)) {
echo 'Created successfully!';
} else {
echo 'Error in file creation';
}