如何使用Perl列出ZIP文件的内容?

3
我想做的事情就是标题所说的。下面这行代码只会打印出 [view archive],当我点击它时,浏览器就直接下载 zip 文件。
print "\<a href=\"http:\/\/intranet.domain.com\/~devcvs\/view-file.cgi?file=$reviewdata{'document'}&review_id=$reviewdata{'id'}\"\>[view archive]\<\/a\>\n";

我希望能够在页面上列出此压缩文件中包含的文件,例如就在链接下方或者新建一个页面并将文件名作为参数传递。
我相信,一旦完成这个任务,浏览器会负责其余部分,只需单击这些文件即可在浏览器中查看它们,因为它们将是PDF和HTML文件,我不预见任何问题。
我确信有一个模块可以实现这个功能,但我不知道如何使用它来实现我的目标。
非常感谢你的帮助。

嗯...第一步是要确定那个模块...你尝试在CPAN上搜索了吗? - Zaid
是的,但我无法弄清楚如何做我想要的事情。 - martincarlin87
2个回答

7
请看 Archive::Zip
use strict;
use warnings;

use Archive::Zip qw/ :ERROR_CODES :CONSTANTS /;

my $zipFile = 'someZip.zip';

my $zip = Archive::Zip->new();

unless ( $zip->read( $zipFile ) == AZ_OK ) {  # Make sure archive got read

    die 'read error';
}

my @files = $zip->memberNames();  # Lists all members in archive

print $_, "\n" for @files;

谢谢!我只是试图将它与我的当前代码集成,还有一些错误需要解决。 - martincarlin87
搞定了,非常感谢Zaid。但是我得到的输出结果是[view archive] Archive::Zip::DirectoryMember=HASH(0x8b105e0) Archive::Zip::DirectoryMember=HASH(0x8b0f938) Archive::Zip::ZipFileMember=HASH(0x8b03c3c) Archive::Zip::ZipFileMember=HASH(0x8b151d8),这些哈希值需要做些什么吗? - martincarlin87
@martincarlin87:我认为你需要使用memberNames()方法。 - Zaid
啊,是的,抱歉我不太熟悉这个模块。你有什么建议可以让这些打印出来的文件名链接到实际文档吗?像使用 a href=.... 这样简单吗? - martincarlin87

2

如果您要广泛处理zip文件,则使用Archive::Zip可以使代码更加简单,建议安装该模块。

但是,对于那些不想安装任何东西的人来说,有一种方法可以仅使用核心模块IO::Uncompress::Unzip(已经包含在任何标准Perl发行版中)列出zip文件的内容。

use strict;
use warnings;

use IO::Uncompress::Unzip qw($UnzipError);

my $zipFile = '/path/to/zipfile.zip';

my $u = IO::Uncompress::Unzip->new($zipFile)
    or die "Error: $UnzipError\n";

my $status;
for ($status = 1; $status > 0; $status = $u->nextStream()) {
    my $header = $u->getHeaderInfo();
    my $zippedFile = $header->{Name};
    if ($zippedFile =~ /\/$/) {
        last if $status < 0;
        next;
    }
    print "$zippedFile\n";
}

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