[Perl]对*.zip文件操作的记录<一>

原创 2015年07月08日 21:11:10

[Perl]对*.zip文件操作的记录<一>

今天要对*.zip文件进行简单的操作,如解压缩,提取某只文件等。来这里记录下,以免忘记。


今天寫的腳本,大概會用到

  1. new( ) 讀取一個zip文件(要分析的zip 文件目錄和文件比較固定),
  2. 再用memberNames( ) 來列出zip中的文件[名],
  3. 再來判斷某個文件是否存在。
  4. 如果存在,就用contents( )讀取其內容,
  5. 最後進行解析。

以下開始用 code 記錄要用到的一些知識點。


先加个帽子 Archive::Zip

#!perl
use strict;
use warnings;

#報告更詳細的問題描述,等同 perl - Mdiagnostics ./my-program.pl
use diagnostics;

#Provide an interface to ZIP archive files.
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );

read( )读取某个zip文件,这里读取文件someZip.zip:

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

someZip.zip压缩的文件内容如下图:
someZip.zip压缩的文件


memberNames( ) 列出zip文件中的文件及文件名,包括目录名。

#Return a list of the (internal) file names of the zip members
my @nameOfmembers = $somezip->memberNames();
print "\n nameOfmembers :@nameOfmembers\n";

显示结果:
nameOfmembers :
a.txt
folder/
folder/b.txt
folder/c


numberOfMembers( )返回zip文件中的文件及文件名的個數。

#Return the number of members I have
my $memberOfmembers = $somezip->numberOfMembers();
print "\n memberOfmembers : $memberOfmembers\n";

顯示結果:
memberOfmembers : 4


membersMatching( ) 查找匹配的個數。

#Return ref to member whose filename equals given filename or undef. 
#'$string' must be in Zip (Unix) filename format.

my $memberMatching = $somezip->membersMatching('.*\.txt');
print "\n memberMatching: $memberMatching\n";

顯示結果:
memberMatching: 2


members( ) 返回zip文件中的文件及文件名的HASH。

#Return a copy of the members array
my @members = $somezip->members();
print "\n members: @members\n";

显示结果:
members:
Archive::Zip::ZipFileMember=HASH(0x2d59594)
Archive::Zip::DirectoryMember=HASH(0x1e51104)
Archive::Zip::ZipFileMember=HASH(0x2d5ad64)
Archive::Zip::ZipFileMember=HASH(0x2d5afd4)


membersMatching( ) 返回zip文件中的匹配的文件及文件名的HASH。

my @textFileMembers = $somezip->membersMatching( '.*\.txt' );
print "\n textFileMembers: @textFileMembers\n";

顯示結果:
textFileMembers:
Archive::Zip::ZipFileMember=HASH(0x2d59594)
Archive::Zip::ZipFileMember=HASH(0x2d5ad64)


fileName( )返回 zip檔案名

#Returns the name of the file last read from. 
#If nothing has been read yet, returns an empty string; 
#if read from a file handle, returns the handle in string form.
print "\n fileName:" . $somezip->fileName();

顯示結果:
fileName:someZip.zip


zipfileComment( ) 返回comment, 個人感覺沒有什麼用處,先記一筆。

print "\n zipfileComment:" . $somezip->zipfileComment();
$somezip->zipfileComment( 'New Comment' );
print "\n zipfileComment:" . $somezip->zipfileComment();

顯示結果:
zipfileComment:
zipfileComment:New Comment


centralDirectorySize( ) 估計很少用不到這個功能。

#Returns central directory size, 
#as read from an external zip file. 
#Not used for writing zips, 
#but might be interesting if you read a zip in.
print "\n centralDirectorySize:" . $somezip->centralDirectorySize();

顯示結果:
centralDirectorySize:360


diskNumber( ) 只是記錄下有這個方法。

#Return the disk that I start on. 
#Not used for writing zips, 
#but might be interesting if you read a zip in. 
#This should be 0, as Archive::Zip does not handle multi-volume archives.
print "\n diskNumber:" . $somezip->diskNumber();

顯示結果:
diskNumber:0


extractTree( ) 将zip 档案中的所有文件解压缩出来,这功能会经常用到。

#If you don't give any arguments at all, 
#will extract all the files in the zip with their original names.
print "\n status:" . $somezip->extractTree();

显示结果:
status:0


会将zip 档案中的folder目录下的文件解压缩出来。

print "\n status:" . $somezip->extractTree("folder");

显示结果:
status:0


extractMember( ) 解压缩匹配的文件。

# now extract the some files into the current directory
# Returns undef if member does not exist in this Zip
$somezip->extractMember( 'a.txt' );
$somezip->extractMember( 'folder/b.txt' );
print "\n status:" .  $somezip->extractMember( 'folder/c' );

顯示結果:
status:0


不是匹配的文件,返回错误2
(AZ_ERROR (2) There was some generic kind of error.)

print "\n status:" . $somezip->extractMember( 'folder/d' );

显示结果:
status:2
error: member not found
at C:/Perl/lib/Archive/Zip/Archive.pm line 186.


contents( )將匹配文件的內容讀出來。這個才是今天我要用到的功能。

# now read the contents from a file
print "\n contents:" . $somezip->contents( 'folder/c' );

顯示結果:
contents: writtem by ChampWang, 20150708, HZ.


最後,有一個extractTree( )的某一项功能的介紹,并無卵用,但还是附上格式和 instance。

$somezip->extractTree( [ $root, $dest, $volume } ] )
$somezip->extractTree( [ { root => $root, zipName => $dest, volume => $volume } ] )

For instance

$somezip->extractTree( 'a' );

when applied to a zip containing the files: a/x a/b/c ax/d/e d/e will extract:
a/x as ./x
a/b/c as ./b/c


$somezip->extractTree( 'a', 'd/e' );

will extract:
a/x to d/e/x
a/b/c to d/e/b/c and ignore ax/d/e and d/e


$somezip->extractTree( 'a', 'd/e', 'f:' );

will extract:
a/x to f:d/e/x
a/b/c to f:d/e/b/c and ignore ax/d/e and d/e


$somezip->extractTree( 'a', '/d/e', 'f:' );

will extract:
a/x to f:\d\e\x
a/b/c to f:\d\e\b\c and ignore ax/d/e and d/e


以下為部分code:

#!perl
use strict;
use warnings;
use diagnostics;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );

#function for extract files and read the contents from the zip file
#writtem by ChampWang, 20150708, HZ.
#ver:0.01

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

#Return a list of the (internal) file names of the zip members
my @nameOfmembers = $somezip->memberNames();
print "\n nameOfmembers :@nameOfmembers\n";


# now read the contents from a file
print "\n contents:" . $somezip->contents( 'folder/c' ) . "\n";

創建,更新,追加zip文件的有關內容,以後有空再寫,這次記錄到此,打住。

Reference:
http://search.cpan.org/~phred/Archive-Zip-1.48/lib/Archive/Zip.pm

版权声明:本文为博主原创文章,未经博主允许不得转载。

perl文件操作总结(全面讲解perl的文件操作)

perl 文件操作,包括打开、关闭文件,读取、定入文件等。 原文链接:http://www.jbxue.com/article/3153.html 打开、关闭文件 open (filev...
  • vip_linux
  • vip_linux
  • 2013年10月23日 13:46
  • 3698

perl 文件目录操作

perl 内置函数的操作 perl目录操作, 创建目录句柄指向要操作的目录。 打开目录句柄使用 opendir ; opendir dirhandle,directory ; 例:取某目录下文件的列表...
  • Shao_You
  • Shao_You
  • 2017年03月03日 18:13
  • 209

Perl 文件和文件夹操作

作为一门编程语言,perl有着强大的文件和文件夹操作功能。Perl利用文件句柄(file handle)和文件夹句柄(dir handle)与操作系统进行输入输出连接。文件和文件夹句柄一般使用大写子母...
  • konglongaa
  • konglongaa
  • 2016年06月07日 09:41
  • 340

如何用Perl向MySQL中插入数据

简单插入 #!\usr\bin\perl use warnings; use strict; use DBI; my ($dbh, $rows); my $dbh = DBI->connect("D...
  • mjj_1094
  • mjj_1094
  • 2016年11月03日 09:20
  • 609

Perl中文件读取操作

一、打开、关闭文件 二、读文件 三、写文件 四、判断文件状态 五、命令行参数 六、打开管道 一、打开、关闭文件   语法为open (filevar, filename),其中filevar为文...
  • yangxuan12580
  • yangxuan12580
  • 2016年05月26日 12:34
  • 3462

Perl处理Excel文件

http://blog.csdn.net/caz28/article/details/7943530 现在很多数据是以Excel文件格式保存的,对人来讲修改添加都比较方便,但程序处理就比较麻烦。 ...
  • zgyrelax
  • zgyrelax
  • 2014年03月16日 23:28
  • 793

perl脚本实践例程

以下为这几天来学习perl脚本语言所写的东东,也算一部分阶段成果咯 过程中还是遇到了许多困难,幸好有网络这个好东东,从前面走过的人那里得到许多帮助 也共享出来,以期对像我一样想学perl的...
  • tiananma0607
  • tiananma0607
  • 2015年10月10日 09:12
  • 317

perl 处理 json 数据

http://xiaofeng1982.blog.163.com/blog/static/315724582014511102541328/ 安装两个插件 (我的perl版本是w...
  • beyondlpf
  • beyondlpf
  • 2014年11月07日 17:15
  • 1602

清除电脑各种使用记录不留痕迹,保护你的隐私!

手动清除电脑痕迹当然可以,只是操作起来麻烦,又容易漏掉一些。找点资料给你:  1.清除最近使用过的文档记录  以Windows XP为例,右键点击“开始”按钮,选择“属性”,在弹出的设置任务栏和开...
  • vebasan
  • vebasan
  • 2014年03月27日 11:31
  • 3520

perl + 匹配前导模式一次或者多次

Vsftp:/data01/mysqllog/binlog# cat a2.pl $_="aaaa@[2]sasas"; if ($_ =~/.*?(\@\[[0-9]+\]).*/){print "...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2016年12月15日 16:26
  • 607
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Perl]对*.zip文件操作的记录<一>
举报原因:
原因补充:

(最多只允许输入30个字)