1

現在、Archive-Tar Pear extensionPHP を使用してファイルのコレクションを Tar アーカイブに追加しています。

これらのファイルは、追加の拡張子を持つファイラーに保存されます。

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

ファイルを追加する際にこの余分な拡張子を削除して、Tar アーカイブに 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 に答える