[英]Adding files to a Tar Archive in PHP with different filenames
我目前正在使用PHP的Archive-Tar Pear extension
將文件集合添加到Tar Archive中。
這些文件存儲在帶有額外擴展名的文件管理器中,例如
filename.tgz.104850209.t or filename2.doc.2154395.t
我想在添加文件時刪除此額外的擴展名,以便我的Tar存檔具有以下文件:filename.tgz和filename2.doc
有沒有辦法在添加到存檔之前不必先復制/重命名源文件?
謝謝馬克。
最新版本的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()
由specifiying文件名(如_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';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.