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

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

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

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

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

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

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

3 ответов


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


хотя документация модуля говорит некоторые глупые вещи о Windows, текущий сопровождающий-Адам Кеннеди, тот же парень, который привел вас Клубничный Perl. Он определенно не против окон. Он выпустил версию October, поэтому они работают над ней. Существует также открытый грант от Фонд Perl to исправить архив:: извлечь ошибки.Ошибка Вы упомянули, RT 35334: кодировка файла по архиву:: Zip, может, просто нужен кто-то показать ему немного любви. Это можешь быть ты. Люди решают проблемы, которые их беспокоят, поэтому, возможно, пока никому не нужен модуль.

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


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

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

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