簡體   English   中英

使用不同的文件名將文件添加到PHP的Tar存檔中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM