如何在Perl中创建Zip存档?

时间:2009-02-18 07:03:19

标签: perl zip

我需要在过滤我想要包含的文件列表后创建一个Zip存档。我希望该模块能够在Windows和Linux中运行。

由于我需要过滤文件列表,我真的不想使用外部程序。我不想引入外部依赖项,因此我可以将脚本编译为Windows上的单个可执行文件(使用ActiveState PDK)。

我已尝试过的内容

到目前为止,我已经在Archive::Zip上使用了CPAN,但它在Windows机器上有一个使用非ASCII文件名的主要错误:文件名在存档中被破坏,因为它们没有得到翻译成unicode。

有一个bug report filed,但它已经超过10个月未更新,在模块文档中,开发人员相当无益(“修复计算机或摆脱Windows”类型)。

更新
感谢brian和Alan Haggai Alavi的澄清,似乎有足够的爱在Archive::Zip很快就能得到这些错误,并最终在Windows中拥有一个功能齐全的zip模块。

3 个答案:

答案 0 :(得分:10)

虽然模块文档说明了一些关于Windows的愚蠢内容,但目前的维护者是Adam Kennedy,就是那个带你Strawberry Perl的人。他绝对不是反Windows。他发布了10月的版本,所以他们正在努力。还有一个从The Perl Foundationfix Archive::Extract bugs的公开拨款。你提到的错误,RT 35334: Filename Encoding by Archive::Zip,也许只需要有人向他们展示一些爱。那可能是你。人们解决了困扰他们的问题,所以也许没有人对模块感兴趣需要这个。

该模块存在问题,自从我在几个项目中使用它以来,我一直在关注它的进展。它最近变得更好,当然可以使用一些爱。有时开源意味着帮助解决您遇到的问题。我知道这并没有帮助您立即解决问题,但我认为除了system()电话之外,我认为您将完成这项工作。

答案 1 :(得分:7)

最近通过在Windows下添加Unicode文件名支持解决了上述错误。 CPAN将在一周内发布具有此修复程序的版本。

答案 2 :(得分:1)

您可以尝试标准分发Archive::Extract。它可能没有任何优于Archive :: Zip,但文档说,如果有问题,它会在你的系统上尝试使用命令行工具来解压缩文件。这在Unix上可能是最强大的,但是Windows有一个zip存档实用程序,应该可以通过命令行访问。另外,Archive :: Extract可以处理许多其他类型的压缩(理论上)。

当然,可能会发现Archive :: Extract只是弄清楚文件使用了什么样的压缩,然后将其传递给适当的其他库,可能是Archive :: Zip。

您也可以尝试使用IO::Uncompress::Unzip,它是对应的IO::Compress::Zip,只需解压缩,阅读和重新拉链即可。如果绝对必要。同样,我不知道它们会有多好用,但它们标准库的所有部分。