【问题标题】:how to use perl Archive::Zip to recursively walk archive files?如何使用 perl Archive::Zip 递归遍历存档文件?
【发布时间】:2012-06-01 17:27:20
【问题描述】:

我有一个小的 perl 脚本,用于在档案中搜索与名称匹配的成员。我想对此进行增强,以便如果它在档案中发现任何也是档案(zip、jar 等)的成员,它将递归地扫描这些成员,寻找原始所需的模式。

我浏览了“Archive::Zip”文档,我想我知道如何做到这一点。我注意到“fh()”和“readFromFileHandle()”方法。但是,在我的测试中,对归档成员的“fh()”调用似乎返回了包含归档的文件句柄,而不是成员。也许我做错了,但我会很感激一个如何做到这一点的例子。

【问题讨论】:

  • 多年后回到今年,我发现那个相关的帖子也让我找到了解决方案。我永远无法让“MemberRead”工作,但使用“内存中文件句柄”打开子存档对我有用。

标签: perl archive


【解决方案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)

【讨论】:

  • 我尝试添加此内容,但出现意外错误。我添加了一个“使用 Archive::Zip::MemberRead;”声明,以及像上面的“->new(”行一样的行,但它失败了“无法通过 /usr/local/share/ 的包“Archive::Zip::MemberRead”找到对象方法“打开” perl/5.14.2/Archive/Zip/Archive.pm 第 570 行。”
  • 嗯。 Archive::Zip::MemberRead 旨在模仿 IO::Handle 但它似乎缺少一种方法。如果这是唯一的问题,那么您可能想尝试通过在程序的开头添加sub Archive::Zip::MemberRead::opened { 1 } 来破解它,但可能还有更多需要修复的地方。我已经通过电子邮件向模块的作者发送了有关此问题的电子邮件,并会尽量记住让您知道结果。与此同时,唯一的其他解决方案是将压缩的成员解压缩到文件中,并以正常方式使用Archive::Zip 打开它们。
  • 我最终使用的答案在我原始帖子的评论中的链接中进行了描述。我最终没有使用 MemberRead,只是一个内存文件句柄。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 2014-11-12
相关资源
最近更新 更多