在PHP中将文件添加到具有不同文件名的Tar归档
我目前正在使用for PHP将文件集合添加到Tar归档中 这些文件存储在具有额外扩展名的文件管理器上 e、 g 我想在添加文件时删除这个额外的扩展名,这样我的Tar归档文件就会有文件:filename.tgz和filename2.doc 是否有一种方法可以做到这一点,而不必在添加到归档文件之前先复制/重命名源文件 谢谢,在PHP中将文件添加到具有不同文件名的Tar归档,php,pear,tar,Php,Pear,Tar,我目前正在使用for PHP将文件集合添加到Tar归档中 这些文件存储在具有额外扩展名的文件管理器上 e、 g 我想在添加文件时删除这个额外的扩展名,这样我的Tar归档文件就会有文件:filename.tgz和filename2.doc 是否有一种方法可以做到这一点,而不必在添加到归档文件之前先复制/重命名源文件 谢谢, Mark.Archive\u Tar在其最新版本中还不支持这种开箱即用的功能。部分功能位于\u addFile()中,另一部分位于\u addString()中 最简单的方法可
Mark.
Archive\u Tar
在其最新版本中还不支持这种开箱即用的功能。部分功能位于\u addFile()
中,另一部分位于\u addString()
中
最简单的方法可能是从Archive\u Tar
扩展并代理所有公共调用,在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';
}
$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';
}
这是快速和肮脏,但希望工作。为了更好地了解我在开始时注意到的函数
\u addFile()
和\u addString()
,您基本上需要另一个能够通过指定文件名(如\u addString()
)来添加文件的函数。尝试编辑@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';
}
$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';
}
谢谢虽然看起来只有在使用_addString()而不是_addFile()时才调用_writeHeaderBlock,所以在这里不起作用。但是你的第二点看起来像是要做的,扩展和一个能够添加带有修饰符的文件的函数。_addFile()应该调用_writeHeader(),然后调用_writeHeaderBlock()。是吗?@duckboy81:谢谢你的编辑建议。对我来说很有道理/裁判: