注册本站  论坛  繁體中文

电脑技巧
手机 | MP3 | MP4 | 显卡 | 主板 | 显示器 | 光存储 | 笔记本 | 网络设备 | 移动存储 | 数码相机
键鼠 | CPU | 音箱 | GPS | 电视 | 服务器 | 投影机 | 机箱电源 | 品牌电脑 | 办公打印 |
| 网站首页 | Cisco | Windows | Linux | Java | Dotnet | Oracle | 网页设计 | 平面设计 | 安全 | 软件应用 | 电脑维修 | 办公维修 |
您现在的位置: 电脑技巧 >> Linux >> Linux编程 >> CGIPerl >> Linux正文

用Perl动态建立ZIP压缩文件

文章来源:CSDN 作者:佚名 更新时间:2007-10-31 0:35:30 【 】 【加入收藏

Perl提供大量处理不同文件格式的内置函数和外来模块。特别是,它可以通过Archive::Zip模块,动态建立和阅读ZIP压缩文件,而不必依赖外来工具和实用工具。本教程说明这个模块的基础理论和常用方法。

首先,在Perl提示符下运行以下命令下载并安装该模块(如果你还没有安装它):

perl> perl -MCPAN -e "install Archive::Zip"

注意,Archive::Zip模块依靠zlib库运行,因此在安装过程中,系统可能要求你下载并安装这个库。

建立ZIP压缩文件

首先我们看一个简单的例子。动态建立一个包含几个其它文件的ZIP压缩文件。输入(或复制)如列表A所示的脚本:

列表A

以下为引用的内容:

#!/bin/perl

use Archive::Zip;# imports

$obj = Archive::Zip->new();# new instance

@files = ('mystuff/ad.gif',

'mystuff/alcon.doc',

'mystuff/alcon.xls');# files to store

foreach $file (@files) {

$obj->addFile($file);# add files

}

if ($obj->writeToFileNamed('dummy.zip') != AZ_OK) {# write to disk

print "Error in archive creation!";

} else {

print "Archive created successfully!";

}

这段脚本相当简单,但值得仔细看一看。第一步是输入Archive::Zip模块,并初始化Archive::Zip对象的一个实例。接下来,将所有文件清单以及它们在磁盘中的位置进行压缩,保存为一个Perl数组。要记住的是,脚本(准确地说,运行脚本的用户)必须拥有访问这些磁盘位置的许可,否则建立压缩文件的过程就会失败。

然后,用foreach()循环遍历这个数组,用对象的addFile()方法在压缩文件中增加列出的文件。一旦循环完成,则通过调用writeToFileNamed()方法把最终的压缩文件写入磁盘,writeToFileNamed()方法接受所建立的ZIP文件的完整路径和名称。记住,脚本必须拥有向指定的磁盘位置写入文件的许可;否则,writeToFileNamed()方法将会失败,因而不能建立压缩文件。

特别要注意调用writeToFileNamed():方法的返回值。如果文件被正确写入,Archive::Zip返回一个AZ_OK值,在往后操作前系统会检查这个值。之后在这个文件中你还会看到这个返回值。

要应用上面的脚本实例,请修改@files数组的内容以反映你的当地系统配置,并试图在命令提示符或浏览器中执行它。如果一切运行正常,这段脚本应该会找到并将所有文件读入一个叫做dummy.zip的文件中。

p>

查看ZIP压缩文件内容

如何查看一个现有的压缩文件呢?Archive::Zip带有一个read()方法,可以阅读一个压缩文件的内容,并可访问与单个文件有关的详细信息。列表B是它的一个应用实例:

列表B

以下为引用的内容:

#!/bin/perl

use Archive::Zip;# imports

$obj = Archive::Zip->new();# new instance

$status = $obj->read("dummy.zip");# read file contents

if ($status != AZ_OK) {

die('Error in file!');

} else {

foreach $member ($obj->members()) { # print file information

print $member->fileName(), ", ", $member->uncompressedSize(), ":", $member->compressedSize(), "n";

}

}

这里,read()方法用于阅读ZIP压缩文件并获得与其内容有关的信息。然后,调用members()方法返回一个结构化对象数组,每个数组元素代表压缩文件中的一个单独文件。通常来说,数组中的每个对象包含相应文件的名称信息、它的许可模式、状态、压缩类型、大小以及最后一次修改时间。我们可以用一个循环方便地提供这些信息,并对它们重新格式化,使它更具可读性,如上面的列表B所示。

以下是一个输出结果样本:

mystuff/ad.gif, 1447:345

mystuff/alcon.doc, 200:34

mystuff/alcon.xls, 28580:21483

在现有ZIP压缩文件中插入文件

如果你已经有一个ZIP压缩文件,只需要往其中增加一个新文件,那么操作过程就相当简单:只要调用addFile()方法,增加文件的名称和路径即可。为说明这一点,我们回到dummy.zip文件,并试图给它增加一些新文件。(列表C

列表C

以下为引用的内容:

#!/bin/perl

use Archive::Zip;# imports

$obj = Archive::Zip->new();# new instance

$status = $obj->read('dummy.zip');# read file contents

if ($status != AZ_OK) {

die('Error in file!');

} else {

@files = ('otherstuff/logo.gif',# files to add

'otherstuff/header.gif',

'morestuff/berlin-bear.psd');

foreach $file (@files) {

$obj->addFile($file);# add files

}

if ($obj->overwrite() != AZ_OK) {# overwrite archive with new contents

print "Error in archive creation!";

} else {

print "Archive created successfully!";

}

}

在一个现有压缩文件中插入一个文件的过程与建立一个新压缩文件非常相似:首先初始化一个新的Archive::Zip对象,在其中读入原始的压缩文件,再建立一个包含增加文件清单的数组,并把这个数组提交给循环中的addFile()方法。成功添加文件后,就可以用overwrite()方法用更新后的压缩文件覆盖原始的压缩文件。

从现有的ZIP压缩文件中提取文件

往压缩文件中添加文件后,如何将它们提取出来呢?很明显,使用extractTree()方法!这个方法允许你把现有压缩文件中的所有文件提取到一个指定的目录中,如列表D所示:

列表D

以下为引用的内容:

#!/bin/perl

use Archive::Zip;# imports

$obj = Archive::Zip->new();# new instance

$status = $obj->read('dummy.zip');# read file contents

if ($status != AZ_OK) {

die('Error in file!');

} else {

$obj->extractTree(undef, "/tmp/");# extract files

}

在上例中,extractTree()方法解压整个压缩文件,将其中的所有文件提取到一个指定目录中。如果这个目录不存在,extractTree()方法将自动建立这个目录;当然,这以脚本获得写磁盘的许可为前提。

有趣的是,你还可以进行更具选择性的提取操作,只提取与一个预先定义的列表相匹配的文件。要完成这个任务,你需要使用extractMember()方法,它逐个提取压缩文件,帮助你安置一个中间过滤器或在继续提取前执行检查。在模块文档中可以找相关实例。

灵活性

如上面的例子所示,Perl的Archive::Zip类的功能相当强大,为你处理ZIP压缩文件提供很大的灵活性。希望上面的脚本样本提起你的兴趣,让你开始自己应用这个类,更一步了解它的运行机制。祝编程快乐!

  • 上一篇Linux:

  • 下一篇Linux:
  • 最 新 热 门
     VMware下Linux与真实主机共享上网
     Linux系统安全隐患及加强安全管理方法
     各类Unix和Linux密码丢失解决方法
     配置Linux操作系统的环境变量
     在Linux系统下刷新主板BIOS的好方法
     删除文件提示:Operation not permitted
     Linux系统下硬盘挂载详细说明
     Linux文本模式下如何发送带附件的Email
     在Linux自动生成一个保险密码的方法
     Linux商业电影动画制作软件列表
    最 新 推 荐
     使用 Perl/Tk 把 GUI 加入服务器编程
     Perl语言编程特殊技巧
     用Perl动态建立ZIP压缩文件
     进行加密与认证的最有用的10个Perl模块
     网络程序员需要掌握的10个有用的Perl模块
     了解操控日期和时间的10个Perl CPAN模块
     企业SOA成功实施的四大关键点研究
     SilverLight基本开发环境简介
     当Web2.0瓦解了媒体暴力与洗脑文化后
     创新和效率 寻找SOA的中国切入点
    相 关 文 章

    删除文件提示:Operation not permitted
    问!要把Linux下xmanager开启总共分几步
    Ubuntu系统下Trac+Subversion+Apache安装
    如何解决Scim和Skype之间的冲突问题
    在SUSE Linux将Tomcat作为Service运行
    使用 Perl/Tk 把 GUI 加入服务器编程
    重新定义Expect在Cron中的交互信息输出
    Linux Virtual Server负载均衡之DR配置实例
    Windows Server 凭什么争夺Linux的用户
    useradd和adduser添加用户工具和方法

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告

     

    Copyright 2006-2008 pcjx.com All Rights Reserved
    电脑技巧 版权所有 粤ICP备06059145号 地图
    本网站所有内容未经许可不得转载或做其他使用