Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中将文件添加到具有不同文件名的Tar归档_Php_Pear_Tar - Fatal编程技术网

在PHP中将文件添加到具有不同文件名的Tar归档

在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()中 最简单的方法可

我目前正在使用for PHP将文件集合添加到Tar归档中

这些文件存储在具有额外扩展名的文件管理器上 e、 g

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

是否有一种方法可以做到这一点,而不必在添加到归档文件之前先复制/重命名源文件

谢谢,
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:谢谢你的编辑建议。对我来说很有道理/裁判: