php压缩文件重命名,使用PHP压缩文件和解压文件 (ZipArchive类的使用)

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

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类的公有属性:

属性

说明

status

ZipArchive 的状态

statusSys

ZipArchive 的系统状态

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目录下(不存在会自动创建)。

  • 0
    点赞
  • 1
    收藏 更改收藏夹
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值