加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:17:07 所属栏目:大数据 来源:网络整理
导读:我们正在从我们当前的构建系统(这是一个烂摊子)转变为使用Ant与Ivy的构建系统.我正在清理所有构建文件,并找到jar依赖项.我认为通过检查项目中的jar,找到它们包含的类,然后将这些类与 Java代码中的各种import语句进行匹配,我可以更容易地自动化它. 我之前使用
我们正在从我们当前的构建系统(这是一个烂摊子)转变为使用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

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 :: 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";
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读