我该如何在Perl中创建Zip压缩文件?

6

我需要在筛选出要包含的文件列表后创建Zip归档文件。最好是模块可以在Windows和Linux上工作。

由于我需要筛选文件列表,所以我不想使用外部程序。我也不想引入外部依赖项,这样我就可以在Windows上将脚本编译为单个可执行文件(使用ActiveState PDK)。

我已经尝试过的

到目前为止,我使用的是Archive::Zip,它可以在CPAN上找到,但是在使用非ASCII文件名的Windows机器上有一个重大错误:文件名在归档中损坏,因为它们没有被转换为Unicode。

错误报告已提交,但是超过10个月没有更新,而且在模块文档中,开发人员并不太乐意提供帮助(属于“修复你的电脑或摆脱Windows”类型)。

更新:
由于brian和Alan Haggai Alavi的澄清,看起来足够的关注正在Archive::Zip中投入以尽快解决这些问题,并最终在Windows中拥有一个完全功能的zip模块。


Zip是一个非常古老的格式,我不完全确定它是否能处理非ANSI字符。如果您的目标语言至少部分使用拉丁字母表(即非中文),您应该尝试将文件名转换为它们的标准拉丁对应项。 - Grey Panther
实际上,规范中已有条款用于存储文件名的utf8版本。您可以在http://www.pkware.com/documents/casestudies/APPNOTE.TXT的附录D中阅读相关内容。 - Renaud Bompuis
你是否更新了Archive::Zip的所有依赖项? - Brad Gilbert
http://search.cpan.org/perldoc?Archive::Zip - Brad Gilbert
3个回答

10
尽管该模块文档对Windows说了一些愚蠢的话,但当前的维护者是Adam Kennedy,他也是Strawberry Perl的创建者。他绝对不反对Windows。他在十月份发布了一个版本,所以他们正在解决这个问题。此外,The Perl Foundation还有一个公开的资助计划,用于修复Archive::Extract中的错误。你提到的错误RT 35334: Filename Encoding by Archive::Zip可能只需要有人关注它。也许这个人就是你。人们解决自己困扰的问题,所以也许目前没有人对该模块感兴趣。
该模块存在问题,我一直在关注它的进展,因为我在几个项目中使用它。最近它变得好多了,当然还可以继续改进。有时开源意味着帮助解决遇到的问题。我知道这不能立即帮助你解决问题,但这是我认为你能够完成任务的方法,除了使用system()调用。

谢谢提供详细信息,Brian。我已经拿到了源代码,昨晚一直在研究是否可以通过某种方式来实现utf8支持。然后Alan Haggai Alavi过来确认这个问题已经解决并且即将发布,所以我会等待并观望。 - Renaud Bompuis

7
最近,在Windows下增加了对Unicode文件名的支持,解决了上述提到的bug。修复程序将在一周内发布到CPAN。

嗨,Alan。谢谢你的更新。我正在查看v1.27_01的源代码,看看是否能够进行修改,但我很高兴很快就会有一个更官方的版本可用。 感谢您在这个模块上的工作。 - Renaud Bompuis
如果可以的话,请更新常见问题解答,删除关于Windows的不太恰当的评论。这种事情没有帮助,反而对针对所有操作系统的Perl构成了伤害。 - Renaud Bompuis
嗨,Renaud,谢谢你的备注。我会确保更新常见问题解答以及模块的 POD。问候。 - Alan Haggai Alavi

1

您可以尝试使用标准发行版Archive::Extract。它可能不比Archive::Zip更好,但文档中说,如果有问题,它会在幕后尝试使用系统上的命令行工具来解压文件。这在Unix上可能是最强大的,但Windows有一个zip归档实用程序,并且应该可以通过命令行访问。此外,Archive::Extract还可以处理许多其他类型的压缩(理论上)。

当然,Archive::Extract可能只是确定文件使用的压缩类型,然后将其传递给适当的其他库,这可能是Archive::Zip。

你也可以尝试使用IO::Uncompress::Unzip和它的对应项IO::Compress::Zip,仅用于解压、读取和重新压缩。如果绝对必要,我不知道这些工具能有多好用,但它们确实都是标准库的一部分。


1
IO::Compress::Zip模块不提供创建包含文件和文件夹的归档工具。它用于压缩数据流和单个文件,有点像gzip的作用。 - Renaud Bompuis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接