6

在过滤我想要包含的文件列表后,我需要创建一个 Zip 存档。最好我希望该模块在 Windows 和 Linux 中都可以工作。

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

我已经尝试过的

到目前为止,我一直使用在CPAN上找到的Archive::Zip ,但它在使用非 ASCII 文件名的 Windows 机器上存在一个重大错误:文件名在存档中被损坏,因为它们没有被翻译成 unicode。

有一个错误报告为此提交,但它已经超过 10 个月没有更新,并且在模块文档中,开发人员相当无益(“修复您的计算机或摆脱 Windows”类型)。

更新:
感谢 brian 和 Alan Haggai Alavi 的澄清,似乎已经投入了足够的精力Archive::Zip来尽快解决这些错误,并最终在 Windows 中拥有一个功能齐全的 zip 模块。

4

3 回答 3

10

尽管模块文档说了一些关于 Windows 的愚蠢的事情,但当前的维护者是 Adam Kennedy,就是给你带来Strawberry Perl的那个人。他绝对不是反Windows。他在 10 月发布了一个版本,因此他们正在努力。Perl 基金会还提供了一项公开拨款来修复 Archive::Extract 错误。您提到的错误,RT 35334: Filename Encoding by Archive::Zip,也许只是需要有人来表达一些爱。那可能是你。人们解决了困扰他们的问题,所以也许对模块感兴趣的人还不需要这个。

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

于 2009-02-18T08:03:01.003 回答
7

最近通过在 Windows 下添加 Unicode 文件名支持解决了上述错误。一周内将在 CPAN 中提供包含该修复程序的版本。

于 2009-02-18T17:26:53.703 回答
1

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

当然,Archive::Extract 可能会简单地计算出文件使用哪种压缩,然后将其传递给适当的其他库,可能是 Archive::Zip。

您也可以尝试IO::Uncompress::Unzip和它的对应物IO::Compress::Zip,仅用于解压缩、读取和重新压缩。如果绝对必要。再说一次,我不知道这些会好多少,但它们都是标准库的一部分。

于 2009-02-18T07:20:29.200 回答