在perl中解压缩(在此检查文件)

时间:2015-02-12 08:35:05

标签: perl

我正在尝试在Perl中提取ZIP文件。 在我的脚本中,我可以检测到一个ZIP文件,我可以选择这个.zip,但之后?

    elsif ( $$file{'ccname'} =~ /(\.zip)$/x )
    {
        # Extraction ZIP
        my $zip_path=

你能帮帮我吗?

此致

3 个答案:

答案 0 :(得分:0)

此作业的工具是Archive::Zip模块。

my $somezip = Archive::Zip->new();
unless ( $somezip->read( 'someZip.zip' ) == AZ_OK ) {
    die 'read error';
}

my @members = $zip->members();

答案 1 :(得分:0)

以下是一个例子:

use strict;
use warnings;

use Archive::Extract;

my $extractor = Archive::Extract->new( archive => 'yourZippedfileName.zip' );
$extractor.extract;     #extract the files to the current working directory

答案 2 :(得分:0)

我实际上只为我写的一个程序做了这个。我使用了IO::Uncompress::Unzip这是Perl中的标准模块。我花了一段时间拼凑起来。对IO::Uncompress::Unzip的解释并不是最好的,而且需要一些试验和错误。

这些是要点:

  • 您必须在IO::Uncompress::Unzip中观看方法的退出状态。如果状态小于零,则表示您遇到问题。在这种情况下,只需die
  • 有一个外部循环,可以提取nextStream的名称。从这里,您可以获得流的Name,它将是您的文件和目录名称。
  • 获得名称后,您必须构建名称的路径。例如,如果Namefoo/bar/barfu/foobar.txt,则需要确保foo/bar/barfu存在,以便您可以写出foobar.txt
  • 有一个内部while循环从流的缓冲区中读取并写入文件本身。这必须是一个循环,因为在您阅读整个流之前可能需要多次尝试。这是我花了一段时间才意识到的。
  • 我使用IO::File并不是必需的。我这样做是因为这个程序中的其他内容都是面向对象的,我认为是时候尝试使用OO接口进行文件读写了。它只会增加混乱。直接使用openprintsay,就像使用标准Perl一样。
  • 我使用File::Spec将目录和文件名连接在一起。它正式将正确的方式连接在一起,将文件和目录名称连接在一起。毕竟,您不知道是否必须在运行System 7的Vax或Mac Plus上运行程序。如果您知道您只在Windows,Linux,Unix或Mac OS X上运行,您可以使用$directory/$file代替File::Spec->join($directory, $file)。如果你的老板对你的剧本无法在他的PDP-11上运行感到不安,请不要责备我。

这是我的节目的摘录:

#! /usr/bin/env perl

use strict;
use warnings;
use feature qw(say);

use File::Basename qw(basename dirname);
use File::Path qw(make_path remove_tree);
use File::Spec;
use File::Temp qw(tempfile tempdir);
use IO::File;
use IO::Uncompress::Unzip;


sub update_zip { 
    my $old_zip_file = shift;
    my $old_version  = shift;
    my $new_version  = shift;

    my $zip_directory_name = dirname $old_zip_file;
    my $zip_file_name = basename $old_zip_file;
    my $unzip_directory = tempdir(
        "$old_zip_file.XXXX",
        DIR => $zip_directory_name,
    );
    #
    # Unzip Artifact
    #
    my $zip_fh = IO::Uncompress::Unzip->new( $old_zip_file )
        or die qq(Cannot open zip "$old_zip_file" for reading.);
    #
    # Go through each element in Zip file
    #
    while ( my $status = $zip_fh->nextStream ) {
        if ( $status < 0 ) {
            die qq(Error in Zip: $IO::Uncompress::Unzip::UnzipError.);
        }
        my $element_name = $zip_fh->getHeaderInfo->{Name};
        next if $element_name =~ m{/$};      # Skip Directories
        my $element_dir = dirname $element_name;
        my $full_element_dir = File::Spec->join( $unzip_directory, $element_dir );
        my $full_element_name = File::Spec->join( $unzip_directory, $element_name );
        if ( not -d $full_element_dir ) {
            make_path $full_element_dir
                or die qq(Can't make directory "$full_element_dir".);
        }
        my $unzipped_fh = IO::File->new( $full_element_name, "w" )
            or die qq(Can't open file "$full_element_name" for writing: $!);
        my $buffer;
        while ( my $status = $zip_fh->read( $buffer ) ) {
            if ( $status < 0 ) {
                die qq(Error in Zip: $IO::Uncompress::Unzip::UnzipError.);
            }
            $unzipped_fh->write( $buffer );
        }
        $unzipped_fh->close;
    }
    $zip_fh->close;
}