我正在尝试在Perl中提取ZIP文件。 在我的脚本中,我可以检测到一个ZIP文件,我可以选择这个.zip,但之后?
elsif ( $$file{'ccname'} =~ /(\.zip)$/x )
{
# Extraction ZIP
my $zip_path=
你能帮帮我吗?
此致
答案 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
,它将是您的文件和目录名称。Name
为foo/bar/barfu/foobar.txt
,则需要确保foo/bar/barfu
存在,以便您可以写出foobar.txt
while
循环从流的缓冲区中读取并写入文件本身。这必须是一个循环,因为在您阅读整个流之前可能需要多次尝试。这是我花了一段时间才意识到的。IO::File
并不是必需的。我这样做是因为这个程序中的其他内容都是面向对象的,我认为是时候尝试使用OO接口进行文件读写了。它只会增加混乱。直接使用open
和print
或say
,就像使用标准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;
}