Intereting Posts
Я хочу найти текущее местоположение пользователя в php Игнорировать ошибку загрузки изображения Вызов функции-члена getSession () для не-объекта в vendor / behat / mink-extension / src / Behat / MinkExtension / Context / RawMinkContext.php в строке 81 PHP получает доступ к переменным $ _POST в массив? как проверить дату с помощью PHP получение значения из столбца, но возвращает null? php сортирует ассоциативные массивы ключами, что эти ключи существуют в другом массиве Получить массив от MySQL до android Как получить сумму времени из базы данных? Предупреждение: trim () ожидает, что параметр 1 будет строкой, массив указан в wp-includes / class-phpmailer.php в строке 973 Что быстрее и лучше определить, существует ли ключ массива в PHP? CodeIgniter – Не удается получить доступ к сообщению об ошибке, соответствующему имени вашего поля Password. (Pword_check) как передать идентификатор в контроллере из действия формы с помощью codeigniter Данные сеанса PHP не сохраняются Результаты запроса SQL в таблицу php

Добавление файлов в Tar Archive в PHP с разными именами файлов

В настоящее время я использую 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'; }