使用PHP压缩文件和解压文件 (ZipArchive类的使用)

您所在的位置:网站首页 如何不用密码解压文件 使用PHP压缩文件和解压文件 (ZipArchive类的使用)

使用PHP压缩文件和解压文件 (ZipArchive类的使用)

2024-07-17 16:47| 来源: 网络整理| 查看: 265

因为自己需要PHP来压缩和解压文件,就上网查了一下发现没有合适的,我就自己研究了一下PHP手册中的ZipArchive类,在这里记录一下学到的东西。

PHP手册:http://php.net/manual/zh/class.ziparchive.php

1.ZipArchive类

首先来看看ZipArchive类的使用方法,这里我翻译了一下PHP手册中的函数说明:

函数功能open打开一个zip文件close关闭zip文件(文件是打开的或新建的)addEmptyDir添加一个新的目录addFile添加一个文件addFromString使用文件内容添加文件addGlob使用glob模式添加文件addPattern使用PCRE模式添加文件deleteIndex使用索引删除一个文件或目录deleteName使用名称删除一个文件或目录extractTo解压Zip文件getArchiveComment返回Zip文件的说明getCommentIndex使用索引返回一个文件或目录的说明getCommentName使用名称返回一个文件或目录的说明getExternalAttributesIndex使用索引检索一个文件或目录的外部属性getExternalAttributesName使用名称检索一个文件或目录的外部属性getFromIndex使用索引返回文件的内容getFromName使用文件名称返回文件的内容getNameIndex使用索引返回一个文件或目录的名称getStatusString返回错误状态消息getStream得到一个文件处理程序中的文件或目录名称(只读)。locateName返回文件或目录的索引renameIndex通过索引重命名一个文件或目录renameName通过文件名重命名一个文件或目录setArchiveComment设置ZIP归档的说明setCommentIndex通过索引设置一个文件或目录的说明setCommentName通过文件名设置一个文件或目录的说明setCompressionIndex通过索引设置一个文件或目录的压缩方法setCompressionName通过文件名设置一个文件或目录的压缩方法setEncryptionIndex通过索引设置一个文件或目录的加密方法setEncryptionName通过文件名设置一个文件或目录的加密方法setExternalAttributesIndex通过索引设置一个条目的外部属性setExternalAttributesName通过文件名设置一个条目的外部属性setPassword为ZIP文件设置密码statIndex通过索引得到一个文件或目录的详细信息statName通过文件名得到一个文件或目录的详细信息unchangeAll撤销所有更改unchangeArchive恢复所有更改unchangeIndex通过索引恢复一个文件或目录的所有更改unchangeName通过文件名恢复一个文件或目录的所有更改

还有 ZipArchive类的公有属性:

属性说明statusZipArchive 的状态statusSysZipArchive 的系统状态numFiles压缩包里的文件数filename在文件系统里的文件名comment压缩包的说明

看到有这么多函数是不是有些眼花?别怕,实现我们功能所使用的函数并不多。

2.使用ZipArchive压缩文件

压缩文件的步骤: 1. new一个ZipArchive类,并且新建一个ZIP文件 2. 向ZIP文件中添加文件或目录 3. 关闭ZIP文件

第一步,新建ZIP文件:

这步很简单:

$zipArc = new ZipArchive(); $zipArc->open('file.zip', ZipArchive::CREATE); 第二步,向ZIP文件中添加文件或目录:

从上面的函数列表中有几个函数可以添加文件或目录:

函数功能addEmptyDir添加一个新的目录addFile添加一个文件addFromString使用文件内容添加文件addGlob使用glob模式从一个目录添加文件addPattern使用PCRE模式从一个目录添加文件

向ZIP文件添加一个空目录:

$zipArc->addEmptyDir ('newdir', ZipArchive::CREATE);

向ZIP文件添加一个文件:

$zipArc->addFile ('file1.txt');

使用文件内容向ZIP文件添加一个文件(意思就是把一段字符串保存到一个文件,并且把这个文件添加到ZIP文件中):

$zipArc->addFromString ('output.txt', 'hello world!');

上面的函数都只能添加一个文件或者目录,如果想批量添加内容怎么办呢?别急,addGlob()和addPattern()提供了我们需要的功能:

addGlobal()函数

bool ZipArchive::addGlob ( string $pattern [, int $flags = 0 [, array $options = array() ]] )

它使用glob模式向ZIP文件中添加文件,什么是glob模式呢?不懂请戳这里, 其实就是与linux命令中文件匹配一样的语法。

$zipArc->addGlob('class/*.php', 0, array('add_path' => 'phpclass/', 'remove_path' => 'class'))

这段代码把class目录中后缀为'.php'的文件添加到了ZIP文件中phpclass目录中。

addPattern()函数

bool ZipArchive::addPattern ( string $pattern [, string $path = "." [, array $options = array() ]] )

它使用PCRE模式向ZIP文件中添加文件,什么是PCRE模式呢?不懂请戳这里, 其实就是pcre正则表达式。

$zipArc->addPattern('/\.(?:php)$/', 'class', array('add_path' => 'phpclass/', 'remove_path' => 'class'))

这段代码功能也是把class目录中后缀为'.php'的文件添加到了ZIP文件中phpclass目录中。

有了这些,我们就可以写一个文件压缩函数了:

/** * 使用ZIP压缩文件或目录 * @param [string] $toName 压缩后的文件名 * @param [string] $fromName 被压缩的文件或目录名 * @return [bool] 成功返回TRUE, 失败返回FALSE */ function zip($fromName, $toName) { if(!file_exists($fromName)){ return FALSE; } $zipArc = new ZipArchive(); if(!$zipArc->open($toName, ZipArchive::CREATE)){ return FALSE; } $res = is_dir($fromName) ? $zipArc->addGlob("{$fromName}/*") : $zipArc->addFile($fromName); if(!$res){ $zipArc->close(); return FALSE; } return $zipArc->close(); }

测试代码:

if(zip('class', 'class.zip')){ echo "success"; } else{ echo "failed"; }

这段代码就可以吧class目录压缩到class.zip文件了,是不是很好用呢,大家可以复制这个函数直接使用。

3.使用ZipArchive压缩文件

压缩文件的步骤: 1. 新建ZipArchive类,并且打开一个ZIP文件 2. 解压ZIP文件中的文件 3. 关闭ZIP文件

解压文件就简单多了:

$zipArc = new ZipArchive(); $zipArc->open('file.zip'); $zipArc->extractTo('dir');

上面的代码将会吧file.zip文件解压到dir目录下(不存在会自动创建)。

我这里也封装成函数给大家使用:

/** * 解压一个ZIP文件 * @param [string] $toName 解压到哪个目录下 * @param [string] $fromName 被解压的文件名 * @return [bool] 成功返回TRUE, 失败返回FALSE */ function unzip($fromName, $toName) { echo filesize($fromName); if(!file_exists($fromName)){ return FALSE; } $zipArc = new ZipArchive(); if(!$zipArc->open($fromName)){ return FALSE; } if(!$zipArc->extractTo($toName)){ $zipArc->close(); return FALSE; } return $zipArc->close(); }

测试代码:

if(unzip('class.zip', 'dir')){ echo "success"; } else{ echo "failed"; }

上面的代码将会吧class.zip文件解压到dir目录下(不存在会自动创建)。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3