代码之家  ›  专栏  ›  技术社区  ›  Renaud Bompuis

如何在Perl中创建zip存档?

  •  6
  • Renaud Bompuis  · 技术社区  · 16 年前

    我需要在过滤了我想要包含的文件列表之后创建一个zip存档。我希望该模块在Windows和Linux中都能工作。

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

    我已经试过了

    直到现在我都用过 Archive::Zip 发现于 CPAN 但是它在使用非ASCII文件名的Windows计算机上有一个主要缺陷:文件名在存档中会损坏,因为它们不会被转换成Unicode。

    有一个 bug report filed 为此,但在超过10个月的时间里它还没有更新,而且在模块文档中,开发人员对“修复您的计算机或摆脱Windows”这类软件相当无益。

    更新:
    多亏了布莱恩和阿兰·哈盖伊·阿拉维的澄清,似乎有足够的爱被投入其中。 Archive::Zip 为了尽快解决这些问题,最终在Windows中有一个功能齐全的zip模块。

    3 回复  |  直到 13 年前
        1
  •  7
  •   Alan Haggai Alavi    16 年前

    上面提到的错误最近通过在Windows下添加Unicode文件名支持而得到了解决。CPAN将在一周内发布具有修复功能的版本。

        2
  •  10
  •   brian d foy    16 年前

    虽然模块文档中提到了一些关于Windows的愚蠢的东西,但当前的维护者是亚当·肯尼迪,他也是带你来的那个人。 Strawberry Perl .他绝对不是反窗户的。他在10月发布了一个版本,所以他们正在研究它。还有一笔来自 The Perl Foundation fix Archive::Extract bugs .你提到的错误, RT 35334: Filename Encoding by Archive::Zip 可能只是需要有人来表达对它的爱。可能是你。人们解决了困扰他们的问题,所以也许对模块感兴趣的人还不需要这个。

    这个模块有问题,自从我在几个项目中使用它以来,我一直在跟踪它的进展。它最近变得好多了,当然可以用一些爱。有时,开源意味着帮助解决您遇到的问题。我知道这并不能立即帮你解决问题,但我认为你应该把这件事放在一边。 system() 电话。

        3
  •  1
  •   Chris Lutz    16 年前

    你可以试试标准发行版 Archive::Extract . 它可能并不比archive::zip更好,但是文档中说,如果有问题,就应该尝试在系统上使用命令行工具来解压缩文件。这在UNIX上可能是最健壮的,但Windows有一个zip存档实用程序,而且 应该 可通过命令行访问。另外,archive::extract可以处理许多其他类型的压缩(理论上)。

    当然,可能会发现archive::extract只是简单地计算出文件使用的压缩类型,然后将其传递给相应的其他库,也就是archive::zip。

    你也可以试试 IO::Uncompress::Unzip 它的对应物, IO::Compress::Zip 只需要解压、阅读和重新解压。如果绝对必要。再说一次,我不知道这些会有多好,但是它们 标准库的所有部分。