gpt4 book ai didi

Perl 使用 IO::Uncompress::AnyUncompress 读取 zip 文件

转载 作者:行者123 更新时间:2023-12-01 23:09:43 27 4
gpt4 key购买 nike

我们正在从当前的构建系统(一团糟)转向使用 Ant 和 Ivy 的系统。我正在清理所有构建文件,并找到 jar 依赖项。我认为如果我可以稍微自动化一下,通过检查 checkin 项目的 jar,找到它们包含的类,然后将这些类与Java 代码。

我以前使用过 Archive::Tar,但 Archive::Zip 不是标准 Perl 模块。 (我担心有人会尝试我的脚本,半夜调用我并告诉我它不起作用。)

我注意到IO::Uncompress::AnyUncompress是一个标准模块,所以我想我可以尝试IO::Uncompress::AnyUncompress或者至少IO: :Uncompress::Unzip` 这也是一个标准模块。

不幸的是,这些模块的文档没有给出示例(根据文档,示例是todo)。

我能够成功打开我的 jar 并创建一个对象:

 my $zip_obj = IO::Uncompress::AnyUncompress->new ( $zip_file );

现在,我想看看内容。根据文档:

获取标题信息

Usage is

$hdr  = $z->getHeaderInfo();
@hdrs = $z->getHeaderInfo();

This method returns either a hash reference (in scalar context) or a list or hash references (in array context) that contains information about each of the header fields in the compressed data stream(s).

好吧,这不是像 Archive::TarArchive::Zip 返回的对象,并且没有提到解析数据的方法或子例程。我将使用 Data::Dumper 并查看引用中包含哪些哈希键。

这是一个简单的测试程序:

#! /usr/bin/env perl
use 5.12.0;
use warnings;

use IO::Uncompress::AnyUncompress;
use Data::Dumper;

my $obj = IO::Uncompress::AnyUncompress->new("testng.jar")

or die qq(You're an utter failure);

say qq(Dump of \$obj = ) . Dumper $obj;

my @header2 = $obj->getHeaderInfo;
say qq(Dump of \$header = ) . Dumper $headers->[0];

这是我的结果:

Dump of $obj = $VAR1 = bless( \*Symbol::GEN0, 'IO::Uncompress::Unzip' );

Dump of $header = $VAR1 = {
'UncompressedLength' => 0,
'Zip64' => 0,
'MethodName' => 'Stored',
'Stream' => 0,
'Time' => 1181224440,
'MethodID' => 0,
'CRC32' => 0,
'HeaderLength' => 43,
'ExtraFieldRaw' => '¦- ',
'ExtraField' => [
[
'¦-',
''
]
],
'FingerprintLength' => 4,
'Type' => 'zip',
'TrailerLength' => 0,
'CompressedLength' => 0,
'Name' => 'META-INF/',
'Header' => 'PK
+N¦6 META-INF/¦- '
};

其中一些看起来有点用。但是,我的所有条目都返回“Name”=>“META-INF/”,因此它看起来不像文件名。

是否可以使用IO::Uncompress::AnyUncompress(甚至IO::Uncompress:Unzip)来读取存档并查看其中有哪些文件它的内容。如果是这样,我如何解析该 header ?

否则,我将不得不使用 Archive::Zip 并让人们知道他们必须从 CPAN 下载并安装它到他们的系统上。

最佳答案

存档中的文件被压缩在不同的数据流中,因此您需要迭代流以获取各个文件。

use strict;
use warnings;
use IO::Uncompress::Unzip qw(unzip $UnzipError);

my $zipfile = 'zipfile.zip';
my $u = new IO::Uncompress::Unzip $zipfile
or die "Cannot open $zipfile: $UnzipError";

die "Zipfile has no members"
if ! defined $u->getHeaderInfo;

for (my $status = 1; $status > 0; $status = $u->nextStream) {
my $name = $u->getHeaderInfo->{Name};
warn "Processing member $name\n" ;

if ($name =~ /\/$/) {
mkdir $name;
}
else {
unzip $zipfile => $name, Name => $name
or die "unzip failed: $UnzipError\n";
}
}

关于Perl 使用 IO::Uncompress::AnyUncompress 读取 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16288977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com