Как я могу создать Zip-архив в Perl? - PullRequest
6 голосов
/ 18 февраля 2009

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

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

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 18 февраля 2009

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

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

7 голосов
/ 18 февраля 2009

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

1 голос
/ 18 февраля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...