首页 > 编程笔记 > PHP笔记 阅读:34

PHP ZipArchive类的用法(附带实例)

本节介绍 PHP 程序中如何使用 ZipArchive 类处理 zip 压缩文件,下面先了解一些常用的方法。

ZipArchive类常用方法

首先是 open() 方法,用于打开zip文件,方法定义如下:
ZipArchive::open(string $filename[, int $flags]) : mixed
其中,参数 $filename 指定 zip 文件路径;参数 $flags 指定打开模式,可用的值包括:
如果 open() 方法返回 true,表示成功打开压缩文件,否则会返回相应的错误代码,包括:
zip 文件操作完成后,可以使用 close() 方法关闭。

向 zip 文档添加内容时,可以使用如下函数。

1) addEmptyDir() 方法的功能是向压缩文件添加空目录,定义如下:
ZipArchive::addEmptyDir(string $dirname) : bool
其中,参数 $dirname 指定新的目录名称,添加成功时返回 true,否则返回 false。

2) addFile() 方法的功能是向压缩文件添加文件,定义如下:
ZipArchive::addFile(string $filename[, string $localname = NULL[, int $start = 0[, int $length = 0]]]) : bool
addFile() 方法的功能是将 $filename 指定的文件添加到 zip 文件,并可通过 $localname 参数指定文件在 zip 文件中的名称,$start 和 $length 参数暂不使用。添加成功时返回 true,否则返回 false。

请注意,如果不指定 $localname 参数,添加到 zip 文件的文件会保持原目录结构。


3) addFromString() 方法用于添加指定的文件名和内容,定义如下:
ZipArchive::addFromString(string $localname, string $contents) : bool
其中,$localname 指定在 zip 文件中显示的文件名;$contents 指定文件添加的内容。操作成功时返回 true,否则返回 false。

4) addGlob() 方法用于从指定目录中按 glob 模式添加文件,定义如下:
ZipArchive::addGlob(string $pattern[, int $flags = 0[, array $options = array()]]) : bool
其中,$pattern 设置目录中文件的过滤模式;参数 $flags 指定一个 glob 标识;参数 $options 使用一个数组指定参数,包括:
5) addPattern() 方法用于从指定目录中按 PCRE 模式(正则表达式)添加文件,定义如下:
ZipArchive::addPattern(string $pattern[, string $path = "."[, array $options = array()]]) : bool
其中,参数 $pattern 设置为一个 PCRE(Perl-compatible Regular Expression) 模式;参数 $path 指定搜索文件的路径;$options 通过数组设置操作参数,设置方法和 addGlob() 方法相同。

6) 解压文件时可以使用 extractTo() 方法,其定义如下:
ZipArchive::extractTo(string $destination[, mixed $entries]) : bool
函数会将 zip 文件中的内容解压到 $destination 参数指定的路径。

下面将综合演示压缩与解压缩操作。

ZipArchive类应用实例

首先,在 d: 盘根目录下创建 testdir 目录,其中创建 a1.txt、a2.txt、b1.txt和b2.txt 文件,并可以在文件中添加一些内容。下面的测试将基于这些文件进行。

下面的代码打开(或创建)d:\test.zip 文件,并将 a1.txt 和 a2.txt 文件添加到压缩文件中:
<?php
$zipfile = "d:\\test.zip";
$za = new ZipArchive();
if($za->open($zipfile,ZipArchive::CREATE)===true) {
    var_dump($za->addFile("d:/testdir/a1.txt","a1.txt"));
    var_dump($za->addFile("d:/testdir/a2.txt","a2.txt"));
    $za->close();
}else{
    echo " 打开 zip 文件失败 ";
}
?>
如果页面显示两个 bool(true),则表示两个文件已成功添加到 d:\test.zip 压缩文件中,并保存到压缩文件中的根(/)路径下。

下面的代码使用 addFromString() 方法向 d:\test.zip 压缩文件中添加 a3.txt 文件:
<?php
$zipfile = "d:\\test.zip";
$za = new ZipArchive();
if($za->open($zipfile,ZipArchive::CREATE)===true) {
    var_dump($za->addFromString("a3.txt","aaa"));
    $za->close();
}else{
    echo " 打开 zip 文件失败 ";
}
?>
执行代码会在 d:\test.zip 压缩文件的根路径下创建 a3.txt,并指定文件内容为 aaa

在下面的代码中,通过 addGlob() 文件将 d:\testdir 目录中的 b1.txt 和 b2.txt 文件添加到 d:\test.zip 压缩文件中的 b 目录下。
<?php
$zipfile = "d:\\test.zip";
$za = new ZipArchive();
if($za->open($zipfile,ZipArchive::CREATE)===true) {
    $opt = array("add_path"=>"b/","remove_path"=>"d:/testdir");
    var_dump($za->addGlob("d:/testdir/b*.txt",0,$opt));
    $za->close();
}else{
    echo " 打开 zip 文件失败 ";
}
?>

下面的代码将 d:\test.zip 压缩文件解压到 d:\testdir1 目录中:
<?php
$zipfile = "d:\\test.zip";
$za = new ZipArchive();
if($za->open($zipfile,ZipArchive::CREATE)===true) {
    var_dump($za->extractTo("d:/testdir1"));
    $za->close();
}else{
    echo " 打开 zip 文件失败 ";
}
?>
解压后的 d:\testdir1 目录的结构见下图:

PHP 8中的新版本

在 PHP 8 中,默认的 ZipArchive 版本升级为 1.19.1,并在 ZipArchive 类中增加了一些成员,如:
使用 phpinfo() 函数查询模块信息时,也可以看到所支持的压缩和加密方法。此外,PHP 8 中还可以在文档关闭后检查错误状态,包括 status 和 statusSys 属性,以及 getStatusString() 方法。

addGlob() 和 addPattern() 方法中的 remove_path 参数指定的内容以前作为一个目录名,而现在会匹配任何内容,匹配的内容可以使用 add_path 参数指定的内容替换。

相关文章