Как я могу создать Zip-архив в Perl?

Мне нужно создать Zip-архив после фильтрации списка файлов, которые я хочу включить. Желательно, чтобы модуль работал как в Windows, так и в Linux.

Поскольку мне нужно отфильтровать список файлов, я действительно не хочу использовать внешнюю программу. Я бы предпочел не вводить внешние зависимости, поэтому я могу скомпилировать скрипт в один исполняемый файл в Windows (используя ActiveState PDK).

Что я уже пробовал

До сих пор я использовал Archive :: Zip найден на CPAN, но имеет серьезную ошибку на компьютере Windows, использующем имена файлов, отличных от ASCII: имена файлов в архиве повреждаются, так как они не переводятся в юникод.

Для этого есть отчет об ошибке, но в нем нет Он был обновлен более чем за 10 месяцев, и в документации модуля разработчик довольно бесполезен (типа «почините свой компьютер или избавьтесь от Windows»).

Обновление:
Благодаря разъяснениям Брайана и Алана Хаггая Алави, кажется, что Archive::Zip уделяется достаточно внимания, чтобы исправить эти ошибки в ближайшее время и, наконец, получить полностью работающий zip-модуль в Windows.


person Renaud Bompuis    schedule 18.02.2009    source источник
comment
Zip - это очень старый формат, и я не совсем уверен, что он может обрабатывать символы, отличные от ANSI. Если в целевом языке используется хотя бы частично латинский алфавит (т. Е. Не китайский), вам следует попытаться преобразовать имена файлов в их стандартные латинские аналоги.   -  person Grey Panther    schedule 18.02.2009
comment
На самом деле в спецификации были положения для хранения версии имени файла в формате utf8. Вы можете прочитать его в Приложении D к pkware.com/documents/casestudies/APPNOTE.TXT < / а>   -  person Renaud Bompuis    schedule 18.02.2009
comment
Вы обновили все зависимости Archive :: Zip?   -  person Brad Gilbert    schedule 18.02.2009
comment
search.cpan.org/perldoc?Archive::Zip   -  person Brad Gilbert    schedule 18.02.2009


Ответы (3)


Вышеупомянутая ошибка была решена совсем недавно путем добавления поддержки имени файла Unicode в Windows. Релиз с исправлением будет доступен в CPAN в течение недели.

person Alan Haggai Alavi    schedule 18.02.2009
comment
Привет, Алан. Спасибо за обновления. Я искал исходный код v1.27_01, чтобы узнать, можно ли его взломать, но я рад, что скоро будет доступна более официальная версия. Спасибо за вашу работу над этим модулем. - person Renaud Bompuis; 19.02.2009
comment
По возможности обновите FAQ, чтобы удалить довольно неприятный комментарий о Windows. Подобные вещи не помогают и оказывают медвежью услугу Perl, предназначенному для всех ОС. - person Renaud Bompuis; 19.02.2009
comment
Привет, Рено, Спасибо за замечание. Я обязательно обновлю FAQ, а также POD модуля. С Уважением. - person Alan Haggai Alavi; 19.02.2009

Хотя в документации модуля говорится о некоторых глупых вещах о Windows, текущий сопровождающий - Адам Кеннеди, тот самый парень, который принес вам Strawberry Perl. Он точно не анти-Windows. Он выпустил октябрьскую версию, так что над ней работают. Также существует открытый грант от The Perl Foundation для fix Archive :: Extract bugs. Указанная вами ошибка RT 35334: Кодирование имени файла с помощью Archive :: Zip, может быть, просто нужно, чтобы кто-то проявил к нему немного любви. Это мог быть ты. Люди решают проблемы, которые их беспокоят, так что, возможно, никому, интересующемуся модулем, он пока не нужен.

У модуля возникли проблемы, и я слежу за его развитием с тех пор, как использую его в паре проектов. В последнее время он стал намного лучше и, безусловно, нуждается в любви. Иногда открытый исходный код означает помощь в устранении проблем, с которыми вы сталкиваетесь. Я знаю, что это не поможет вам немедленно решить вашу проблему, но я думаю, что вы собираетесь это сделать, помимо system() вызовов.

person brian d foy    schedule 18.02.2009
comment
Спасибо за подробности, Брайан. Я получил исходный код и просматривал его вчера вечером, чтобы посмотреть, смогу ли я что-нибудь взломать, чтобы получить поддержку utf8. Затем зашел Алан Хаггай Алави, чтобы подтвердить, что это уже сделано и скоро будет доступно, так что я подожду и посмотрю. - person Renaud Bompuis; 19.02.2009

Вы можете попробовать стандартный дистрибутив Archive :: Extract. Возможно, это не лучше, чем Archive :: Zip, но в документации сказано, что при возникновении проблем он идет под капотом, чтобы попытаться использовать инструменты командной строки в вашей системе, чтобы распаковать файл. Это, вероятно, наиболее надежно в Unix, но в Windows есть утилита для архивирования zip-архива, и она должна быть доступна через командную строку. Кроме того, Archive :: Extract может обрабатывать многие другие типы сжатия (теоретически).

Конечно, может оказаться, что Archive :: Extract просто определяет, какой тип сжатия использует файл, и затем передает его в соответствующую другую библиотеку, которой может быть Archive :: Zip.

Вы также можете попробовать IO :: Uncompress :: Unzip и его аналог, IO :: Compress :: Zip для простого разархивирования, чтения и повторного архивирования. В случае крайней необходимости. Опять же, я не знаю, насколько они будут работать лучше, но все они являются частью стандартной библиотеки.

person Chris Lutz    schedule 18.02.2009
comment
IO: Compress :: Zip не предоставляет инструментов для создания архива, содержащего файлы и папки. Он используется для сжатия потоков и отдельных файлов, как и gzip. - person Renaud Bompuis; 18.02.2009