В настоящее время я использую Archive-Tar Pear extension
для PHP, чтобы добавить коллекцию файлов в Tar Archive.
Эти файлы хранятся на филлере с дополнительным расширением, например
filename.tgz.104850209.t or filename2.doc.2154395.t
Я бы хотел удалить это дополнительное расширение при добавлении файлов, чтобы у моего Tar Archive были файлы: filename.tgz и filename2.doc
Есть ли способ сделать это без необходимости копировать / переименовывать исходные файлы перед добавлением в архив?
Спасибо, Марк.
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()
).
Пытался отредактировать ответ @ 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'; }