LINUX.ORG.RU

TAR средствами PHP - проблема с длинными путями файлов

 ,


0

2

Здравствуйте, добрые и умные люди. Возникла особая задача - формировать tar-архив средствами PHP. Стандартная linux утилита tar (равно как и встроенный в php класс PharData) не подходит, т.к. нужно читать данные из stdin и передавать в stdout. А tar не умеет читать stdin.

PHP выбран только потому, что его знаю лучше всего. Нагуглил вот такую библиотеку, которая решает мои задачи (класс TarArchive) За исключением некоторых багов работает прекрасно, но... формируемые ею архивы по какой-то причине читаются windows'овским WinRAR'ом лишь частично. Как я понял - это связано с файлами, у которых полная длина имени больше 155 символов (включая папки, в которых он лежит). Некоторые имена он просто обрезает, а некоторые тупо пропадают из списка файлов. В результате примерно 2/3 архива он не видит. Библиотечка для записи файлов с длинными именами использует вот такой код: http://imageshack.com/i/pnvKHZRlp http://imageshack.com/i/pnoVcFUkp И даже отсылает нас к описанию «Pax Interchange Format». Сама утилита tar потом прекрасно читает и распаковывает такие архивы без проблем, то есть вроде бы как всё работает. Но архив, сделанный PHP, получается меньше, чем сделанный tar'ом (630 Мб против 650). И если делать из командной строки стандартной утилитой, то потом ведь WinRAR прекрасно читает архивы, содержащие длинные пути до файлов. Такое ощущение, что для корректной работы WinRAR'а с полученными в результате работы php архивами в них просто не хватает каких-то метаданных (эти самые 20 Мб расхождения). Очень хочется понять, в чём же дело, какие данные нужно добавить, чтобы WinRAR увидел все файлы и не обрезал пути. Буду признателен за любую наводку, сам уже который день не могу победить данную особенность tar-архива, сделанного php.

Ответ на: комментарий от no-such-file

Но ведь действительно не умеет (создавать архив из stdin)

deadNightTiger ★★★★★ ()
Ответ на: комментарий от no-such-file

Я читал. Речь не о списке входящих файлов, а именно stdin. Например, данные, выдаваемые mysqldump'ом, никак не передать в tar для объединения с другими файлами, не создавая ничего на диске. Если вы знаете, как это сделать стандартной утилитой, буду безмерно благодарен.

Novascriptum ()

GNU tar поддерживает аж пять форматов:

              gnu    GNU tar 1.13.x format

              oldgnu GNU format as per tar <= 1.12.

              pax, posix
                     POSIX 1003.1-2001 (pax) format.

              ustar  POSIX 1003.1-1988 (ustar) format.

              v7     Old V7 tar format.
Твоя библиотека, судя по всему, пакует в pax, а консольный tar - в gnu. Может, винрар не умеет правильно читать pax формат?

deadNightTiger ★★★★★ ()
Ответ на: комментарий от Novascriptum

Выкинь php, у питона в стандартной библиотеке есть tarfile, умеющий паковать в GNU формат :)

deadNightTiger ★★★★★ ()
Ответ на: комментарий от Novascriptum

У меня была одно время в каком-то смысле похожая проблема. Посмотрите как можно делать с помощью пайпа архивирование tar-ом и разворачивание им же. К примеру, вот тут: https://unixforum.org/index.php?showtopic=85814&hl=

Насколько помню, скрипт рабочий, писал его Ваш покорный слуга, если есть вопросы почему и как работает, могу ответить.

Т.е. идея в том, чтобы создать трубу и использовать её для параметра -f вместо stdin. Но меня там, как и Вас тут, нещадно критиковали. )))

Infra_HDC ★★★★★ ()
Ответ на: комментарий от deadNightTiger

Ещё раз спасибо, дело было именно в этом. Стал использовать в PHP алгоритмы gnu-tar, WinRAR прочитал архив. Фантастика!

Novascriptum ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.