Perl使用IO :: Uncompress :: AnyUncompress读取zip文件
|
我们正在从我们当前的构建系统(这是一个烂摊子)转变为使用Ant与Ivy的构建系统.我正在清理所有构建文件,并找到jar依赖项.我认为通过检查项目中的jar,找到它们包含的类,然后将这些类与
Java代码中的各种import语句进行匹配,我可以更容易地自动化它.
我之前使用过Archive :: Tar,但Archive :: Zip不是标准的Perl模块. (我担心的是有人会尝试我的剧本,在半夜打电话给我,告诉我它不起作用.) 我注意到IO :: Uncompress :: AnyUncompress是一个标准模块,所以我想我可以尝试IO :: Uncompress :: AnyUncompressor至少IO :: Uncompress :: Unzip`这也是一个标准模块. 不幸的是,这些模块的文档没有给出任何示例(根据文档,示例是todo). 我能够成功打开我的jar并创建一个对象: my $zip_obj = IO::Uncompress::AnyUncompress->new ( $zip_file ); 现在,我想看看内容.根据文件: getHeaderInfo
$hdr = $z->getHeaderInfo(); @hdrs = $z->getHeaderInfo();
好的,这不是像Archive :: Tar或Archive :: 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)来读取存档并查看其内容中的文件.如果是这样,我该如何解析该标题? 否则,我将不得不使用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 $namen" ;
if ($name =~ //$/) {
mkdir $name;
}
else {
unzip $zipfile => $name,Name => $name
or die "unzip failed: $UnzipErrorn";
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
