Здравствуйте, добрые и умные люди. Возникла особая задача - формировать 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.