-1

如何使用 perl 获取 zip 文件的目录结构Archive::Zip?我尝试了不同的方法组合,但没有成功。

4

4 回答 4

1

你读过文档吗?

$!/usr/bin/perl
use strict;
use warnings;
use feature 'say';

use Archive::Zip;

my $z = Archive::Zip::->new;
$z->read(shift);
say for $z->memberNames;
于 2013-04-04T13:28:45.293 回答
0

我没有安装 Archive::Zip,自从我上次使用它已经很久很久了。

你熟悉面向对象的 Perl 吗?你没有具体说明你之前做了什么。我知道许多不熟悉面向对象 Perl 的人(不幸的是,绝大多数使用 Perl 的人)发现 Perl 的面向对象语法令人困惑。

要使用Archive::Zip,您需要创建一个Archive::Zip对象,该对象将包含您尝试通过构造函数读取的存档的所有信息。

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

# Always check to see if the object was created!
if ( not defined $zip ) {
    die qq(Could not open "$archive_to_read");
}

这会将您的$archive_to_readZip 文件作为类对象打开$zip

现在,您可以使用members 或 memberNames方法获取存档的所有成员。将members返回成员列表,但这些是成员对象,而不仅仅是成员的名称。该memberNames方法将返回成员名称的列表。我不知道这是否包括目录。同样,您没有指定您尝试了什么,所以我不知道您是否尝试过这个并且没有得到您想要的。

#Returns a list of member objects
my @member_list = $zip->members;

#May do what you want. I don't know if dir names are included.
my @member_names = $zip->memberNames;

如果memberNames不这样做,您可以获取成员对象列表并使用成员操作从每个成员对象中提取信息:

for my $member ( @member_list ) {
    my $file_name = $member->FileName;
    print qq(File "$file_name" is in "$archive_to_read"\n);
}

再说一次,我已经很久没有使用 了Archive::Zip,所以我不能保证这是否 100% 准确。如果您提供了更多关于您遇到问题的原因的信息,那会更容易。您了解使用的基础知识Archive::Zip吗?您是否使用了特定的方法,却没有得到您想要的信息?

我强烈推荐的一件事是,如果您不了解面向对象的 Perl,请学习它。Perl 包含有关面向对象的 Perl 语法及其工作原理的教程。这是现在大多数现代 Perl 模块在 Perl 中工作的方式。

如果您确实了解面向对象的 Perl 语法,请记住Data::Dumper是您的朋友。它将帮助您了解您正在阅读的数据以及您正在查看的内容。您永远不应该使用此信息直接操作对象,但它会让您了解对象中存储的内容以及其中可能隐藏的其他对象类型。

再一次:Stackoverflow 上的人们想提供帮助,但不介意读者。我们需要确切地知道您遇到了什么问题。你甚至尝试过使用Archive::Zip吗?您是否了解面向对象 perl 语法的基本工作方式,如果不了解,这是否让您感到困惑?您是否尝试过该members方法并因为它没有产生您想要的结果而感到沮丧?我们知道的越多,我们能提供的帮助就越多。

您说您尝试使用Archive::Zip,但没有向我们展示您尝试了什么。下次,让我们知道您的代码是什么样的以及您遇到了什么问题。

于 2013-04-04T15:40:26.347 回答
0

有一个称为memberNames返回zip 存档的所有成员的方法。提取所有目录成员很简单,因为它们以斜杠结尾。

这个程序演示

use strict;
use warnings;

use Archive::Zip;

my $file = 'myfile.zip';

my $z = Archive::Zip->new($file);
my @zipdirs = grep m|/$|, $z->memberNames;
print "$_\n" for @zipdirs;

正如思南所说,检查isDirectory每个存档成员可能更正确。这可能会产生与上述相同的结果。

my @zipdirs = map $_->fileName, grep $_->isDirectory, $zip->members;
于 2013-04-04T16:27:47.040 回答
0
my @dirs = grep $_->isDirectory, $zip->members;
于 2013-04-04T16:31:22.290 回答