1

我目前正在使用Archive-Tar Pear extensionfor PHP 将文件集合添加到 Tar 存档中。

这些文件存储在具有额外扩展名的文件管理器上,例如

 filename.tgz.104850209.t or filename2.doc.2154395.t

我想在添加文件时删除这个额外的扩展名,这样我的 Tar Archive 就会有文件:filename.tgz 和 filename2.doc

有没有办法在添加到存档之前不必先复制/重命名源文件?

谢谢,马克。

4

2 回答 2

2

Archive_Tar在其最新版本中尚不支持开箱即用的此类功能。部分功能在_addFile(),另一部分在_addString().

最简单的可能是扩展Archive_Tar和代理所有公共调用_writeHeaderBlock(),在文件名参数上应用映射,以便在写入标题时重命名。

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()

于 2013-04-05T10:30:29.087 回答
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';
}
于 2016-07-08T01:48:33.737 回答