在perl中解压(检查此文件中的文件)
我试图用Perl提取一个ZIP文件。 在我的脚本中,我可以检测到一个ZIP文件,我可以选择这个.ZIP,但是之后呢在perl中解压(检查此文件中的文件),perl,Perl,我试图用Perl提取一个ZIP文件。 在我的脚本中,我可以检测到一个ZIP文件,我可以选择这个.ZIP,但是之后呢 elsif ( $$file{'ccname'} =~ /(\.zip)$/x ) { # Extraction ZIP my $zip_path= 你能帮我吗 关于,此作业的工具是模块 及 以下是一个例子: use strict; use warnings; use Archive::Extract; my $extracto
elsif ( $$file{'ccname'} =~ /(\.zip)$/x )
{
# Extraction ZIP
my $zip_path=
你能帮我吗
关于,此作业的工具是模块 及 以下是一个例子:
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
实际上我只是为我写的一个程序做这个。我使用了IO::Uncompress::Unzip,这是Perl中的一个标准模块。我花了一段时间才拼凑起来。对IO::Uncompress::Unzip的解释并不是最好的,它需要一些尝试和错误 以下是要点: 您必须在IO::Uncompress::Unzip中观察方法的退出状态。如果状态小于零,则说明存在问题。那样的话,就去死吧。 有一个外部循环,可以提取下一个流的名称。从这里,您可以获得流的名称,它将是您的文件和目录名。 获得名称后,必须构建名称的路径。例如,如果名称为foo/bar/barfu/foobar.txt,则需要确保foo/bar/barfu存在,以便可以写出foobar.txt 有一个内部while循环,用于从流的缓冲区读取数据并写入文件本身。这必须是一个循环,因为在读取整个流之前可能需要多次尝试。这是我花了一段时间才意识到的。 我使用IO::File,这不是必需的。我这样做是因为这个程序中的所有其他东西都是面向对象的,我认为是时候尝试一下用于文件读写的OO接口了。这只会增加混乱。像在标准Perl中一样,使用open和print或直接说。 我使用File::Spec将目录和文件名连接在一起。这是连接文件名和目录名的正式正确方法。毕竟,你不知道你是否必须在Vax或Mac Plus运行System 7上运行你的程序。如果您知道您只在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;
}
使用外部命令执行-@kostiashian:为什么使用外部命令?@JE SUIS CHARLIE:为什么不?我们可以通过系统调用运行外部程序,如:my$res=system$7zpath、$arc\u file\u path、$directory\u path,并使用$res变量控制结果执行。@kostiashian:因为最好使用像Archive::Zip这样的模块。
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
#! /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;
}