Archive::Zip 和 IO::Uncompress::Unzip 有什么区别

What are differences between Archive::Zip and IO::Uncompress::Unzip

我是 Perl 编程新手。

我有一个 8GB 的​​ zip 文件,其中包含数据文件和元数据文件。目标是读取元数据文件的内容以与 zip 中的数据文件名进行比较。

当前实施使用 IO::Uncompress::Unzip,读取元数据文件 ~60KB 花费的时间太长(~15 分钟)。

我已经使用 Archive::Zip::MemberRead 创建了一个 PoC 脚本,从同一个文件中提取信息并且执行速度非常快(以秒为单位)。

我担心在我的场景中使用 Archive::Zip 有任何限制。

@MiguelPrz: in my script, there is step walkthrough to zip file to retrieve member name and size and it quite fast. And next step is read the content of metadata file, by using unzip with specified file name, it very slow. – Le Vu

无需调用 unzip -- 您可以使用 IO::Uncompress::Unzip 直接访问元数据文件。

这是一个快速运行的示例,它将检查名为 metadata.txt 的成员的 zip 文件。如果找到它,它会将内容读入内存并打印出来。

首先创建一个测试 zip 文件,其中包含一个名为 metadata.txt 的成员。

$ echo abc >metadata.txt
$ zip test.zip metadata.txt 
  adding: metadata.txt (stored 0%)

现在一些代码遍历 zip 文件并检查元数据成员。

#!/usr/bin/perl


use strict;
use warnings;

use IO::Uncompress::Unzip qw($UnzipError);
 
my $zipfile = "test.zip";
my $u = IO::Uncompress::Unzip->new( $zipfile )
    or die "Cannot open $zipfile: $UnzipError";
 
my $status;
for ($status = 1; $status > 0; $status = $u->nextStream())
{
    my $name = $u->getHeaderInfo()->{Name};
    warn "Processing member $name\n" ;
 
    if ($name eq 'metadata.txt')
    {
        local $/;
        my $data = <$u>;
        print "METADATA is [$data]\n";
    }

    last if $status < 0;
}
 
die "Error processing $zipfile: $!\n"
    if $status < 0 ;

当我 运行 得到这个输出时

$ perl testzip.pl
Processing member metadata.txt
METADATA is [abc
]

[全面披露 -- 我是 IO::Uncompress::Unzip]

的作者