使用不同的文件名将文件添加到PHP中的Tar存档

时间:2013-04-05 10:04:04

标签: php pear tar

我目前正在使用PHP的Archive-Tar Pear extension将一组文件添加到Tar Archive中。

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

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

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

在添加到存档之前,是否有办法在不必复制/重命名源文件的情况下执行此操作?

谢谢, 标记

2 个答案:

答案 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';
}