2013-04-05 1 views
1

В настоящее время я использую Archive-Tar Pear extension для PHP, чтобы добавить коллекцию файлов в Tar Archive.Добавление файлов в Tar Archive в PHP с разными именами файлов

Эти файлы хранятся на фильтре с дополнительным расширением , например.

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

Я хотел бы, чтобы удалить это дополнительное расширение при добавлении файлов, так что мой Tar архив будет иметь файлы: filename.tgz и filename2.doc

Есть ли способ сделать это без до скопируйте/переименуйте исходные файлы перед добавлением в архив?

Thanks, Mark.

ответ

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

Это быстро и грязно, но мы надеемся, worky. Для чего-то лучше увидеть функцию, которую я заметил в начале _addFile() и _addString(), вы в основном хотите другой, который может добавить файл (как с _addFile()), указав имя файла (как с _addString()).

+0

Спасибо. Хотя похоже, что _writeHeaderBlock вызывается только при использовании _addString(), а не _addFile(), так что это не сработает. Но ваш второй пункт выглядит как способ, чтобы расширить и функцию, чтобы иметь возможность добавлять файлы с помощью модификатора. – user2248522

+0

_addFile() должен вызывать _writeHeader(), который затем должен вызывать _writeHeaderBlock(). Не так ли? – hakre

+1

@ duckboy81: Спасибо за ваше предложение по редактированию. Для меня смысл./ref: http://stackoverflow.com/review/spected-edits/12939455 – hakre

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

 Смежные вопросы

  • Нет связанных вопросов^_^