如何在 Perl 中创建 Zip 存档?
Posted
技术标签:
【中文标题】如何在 Perl 中创建 Zip 存档?【英文标题】:How can I create a Zip archive in Perl? 【发布时间】:2009-02-18 07:03:19 【问题描述】:我需要在过滤我想要包含的文件列表后创建一个 Zip 存档。最好我希望该模块同时在 Windows 和 Linux 中工作。
由于我需要过滤文件列表,我真的不想使用外部程序。我也不想引入外部依赖项,这样我就可以在 Windows 上将脚本编译成单个可执行文件(使用ActiveState PDK)。
我已经尝试过的
到目前为止,我一直在使用 CPAN 上的 Archive::Zip,但它在使用非 ASCII 文件名的 Windows 机器上存在一个重大错误:文件名在存档中被损坏,因为它们没有被翻译成 unicode。
有一个bug report filed,但它已经超过 10 个月没有更新,并且在模块文档中,开发人员相当无益(“修复你的计算机或摆脱 Windows”那种)。
更新:
感谢 brian 和 Alan Haggai Alavi 的澄清,Archive::Zip
似乎得到了足够的支持,以便尽快解决这些错误并最终在 Windows 中拥有一个功能齐全的 zip 模块。
【问题讨论】:
Zip 是一种非常古老的格式,我不完全确定它可以处理非 ANSI 字符。如果您的目标语言至少部分使用拉丁字母(即非中文),您应该尝试将文件名转换为标准拉丁字母。 其实规范中已经有规定存储文件名的utf8版本。您可以在pkware.com/documents/casestudies/APPNOTE.TXT的附录D中阅读它 是否更新了 Archive::Zip 的所有依赖项? search.cpan.org/perldoc?Archive::Zip 【参考方案1】:虽然模块文档说了一些关于 Windows 的愚蠢的话,但当前的维护者是 Adam Kennedy,就是为您带来 Strawberry Perl 的同一个人。他绝对不是反Windows。他在 10 月发布了一个版本,因此他们正在努力。还有一个从The Perl Foundation 到fix Archive::Extract bugs 的公开资助。你提到的错误,RT 35334: Filename Encoding by Archive::Zip,可能只是需要有人来表达一些爱。那可能是你。人们解决了困扰他们的问题,所以也许对模块感兴趣的人还需要这个。
该模块有问题,自从我在几个项目中使用它以来,我一直在关注它的进展。它最近好多了,当然可以使用一些爱。有时开源意味着帮助解决您遇到的问题。我知道这并不能帮助您立即解决问题,但我认为除了system()
电话之外,您还可以这样做。
【讨论】:
感谢布赖恩提供的详细信息。我得到了源代码,昨晚正在查看它是否可以破解一些东西以获得 utf8 支持。然后 Alan Haggai Alavi 过来确认这已经完成并很快可用,所以我会拭目以待。【参考方案2】:最近通过在 Windows 下添加 Unicode 文件名支持解决了上述错误。一周内将在 CPAN 中发布包含该修复程序的版本。
【讨论】:
嗨艾伦。感谢更新。我正在查看 v1.27_01 的源代码,看看我是否可以破解它,但我很高兴很快就会有更正式的版本可用。感谢您在此模块上所做的工作。 如果可以,请更新常见问题解答以删除有关 Windows 的相当不雅的评论。这类事情没有帮助,而且对面向所有操作系统的 Perl 造成损害。 嗨雷诺,谢谢你的评论。我一定会更新常见问题解答以及模块的 POD。问候。【参考方案3】:您可以尝试标准发行版Archive::Extract。它可能并不比 Archive::Zip 好,但文档说,如果有问题,它会在后台尝试使用系统上的命令行工具来解压缩文件。这在 Unix 上可能是最强大的,但 Windows 有一个 zip 存档实用程序,并且它应该可以通过命令行访问。此外,Archive::Extract 可以处理许多其他类型的压缩(理论上)。
当然,Archive::Extract 可能会简单地计算出文件使用哪种压缩,然后将其传递给适当的其他库,可能是 Archive::Zip。
您也可以尝试IO::Uncompress::Unzip 和它的对应物IO::Compress::Zip,仅用于解压缩、读取和重新压缩。如果绝对必要。再说一次,我不知道这些会好到什么程度,但它们都是标准库的一部分。
【讨论】:
IO:Compress::Zip 不提供用于创建包含文件和文件夹的存档的工具。它用于压缩流和单个文件,有点像 gzip。以上是关于如何在 Perl 中创建 Zip 存档?的主要内容,如果未能解决你的问题,请参考以下文章