使用Perl从zip获取目录结构

时间:2013-04-04 13:23:10

标签: perl zip archive

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

4 个答案:

答案 0 :(得分:1)

您是否阅读过documentation

$!/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;

答案 1 :(得分:0)

我没有安装Archive :: Zip,自从我上次使用它以来已经很长很长时间了。

您熟悉面向对象的Perl吗?你没有说明你以前做过的事情。我知道许多不熟悉面向对象Perl的人(不幸的是绝大多数使用Perl的人)都发现Perl的面向对象语法令人困惑。

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

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_read Zip文件作为类对象$zip

现在,您可以使用members or 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没有这样做,您可以获取成员对象的列表,并使用Member Operations从每个成员对象中提取信息:

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包含tutorial on Object Oriented Perl syntax及其工作原理。这是大多数现代Perl模块现在在Perl中工作的方式。

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

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

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

答案 2 :(得分: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;

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

my @zipdirs = map $_->fileName, grep $_->isDirectory, $zip->members;

答案 3 :(得分:0)

my @dirs = grep $_->isDirectory, $zip->members;