如何使用Perl Archive::Zip来递归遍历存档文件?

3
我有一个小的perl脚本,用于搜索匹配名称的成员存档。 我想增强这个脚本,以便如果它在存档中找到任何成员也是存档(zip、jar等),它将递归扫描这些存档,寻找原始所需模式。
我已经查看了“Archive :: Zip”文档,并且我认为我看到了如何做到这一点。 我注意到“fh()”和“readFromFileHandle()”方法。 但是,在我的测试中,似乎对存档成员调用“fh()”会返回包含存档的文件句柄,而不是成员。 也许我做错了,但我希望能够得到一个如何做到这一点的示例。

回到这个问题几年后,我发现相关的帖子也给了我一个解决方案。我从来没有成功地使用“MemberRead”,但是使用“内存文件句柄”打开子档案对我很有效。 - David M. Karr
1个回答

1

如果不将存档文件中的任何成员(无论是文本、图片还是其他存档)提取出来,就无法读取其内容。

一旦确定要查看的成员,必须调用extractMember(或更可能的是extractMemberWithoutPaths,如果文件是临时的)将其提取到磁盘文件中。然后,您可以创建一个新的Archive::Zip对象并在保持旧文件打开的同时read新文件。

在编目完存档文件的内容后,您可能希望unlink该文件。


编辑

我之前没有接触过Archive::Zip::MemberRead模块。看起来你在使用readFromFileHandle时是正确的。我猜它应该像这样工作,但目前对我来说测试会有些困难。

my $zip = Archive::Zip->new;
$zip->read('myfile.zip');

my $zipfh  = Archive::Zip::MemberRead->new($zip, 'archive/path/to/member.zip');

my $newzip = Archive::Zip->new;
$newzip->readFromFileHandle($zipfh)

1
我尝试添加了这个,但是出现了一个意外错误。我添加了一个"use Archive::Zip::MemberRead;"声明,以及类似于您上面的 "->new("行的代码,但是它失败了,显示"Can't locate object method "opened" via package "Archive::Zip::MemberRead" at /usr/local/share/perl/5.14.2/Archive/Zip/Archive.pm line 570."。 - David M. Karr
嗯。Archive::Zip::MemberRead旨在模拟IO::Handle,但似乎缺少一个方法。如果这是唯一的问题,那么您可以尝试通过在程序开头添加sub Archive::Zip::MemberRead::opened { 1 }来进行修改,但可能还需要修复其他问题。我已经给模块的作者发送了电子邮件,并会尽力记得告诉您结果。同时,唯一的其他解决方案是将压缩成员提取到文件中,并以正常方式使用Archive::Zip打开它们。 - Borodin
我最终使用的答案在我的原始帖子的评论链接中描述。我没有使用MemberRead,而是使用了内存文件句柄。 - David M. Karr

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