PHP Conference Japan 2024

ZipArchive::close

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::close关闭活动归档文件(已打开或新创建)

描述

public ZipArchive::close(): bool

关闭已打开或创建的归档文件并保存更改。此方法会在脚本结束时自动调用。

如果归档文件不包含任何文件,则根据ZipArchive::AFL_CREATE_OR_KEEP_FILE_FOR_EMPTY_ARCHIVE全局标志的值,默认情况下会完全删除该文件(不会写入空归档文件)。

参数

此函数没有参数。

返回值

成功时返回true,失败时返回false

参见

添加注释

用户贡献的注释 8 条注释

jared at kippage dot com
15 年前
对某些人来说,这可能看起来很明显,但这是我自己的疏忽。

如果您要向压缩文件中添加要删除的文件,请确保在调用 close() 函数后删除这些文件。

如果添加到对象的文件在保存时不可用,则不会创建压缩文件。
john factorial
13 年前
如果您正在向压缩文件中添加多个文件,并且您的 $zip->close() 调用返回 FALSE,请确保您添加的所有文件都实际存在。显然,即使文件实际上不存在,$zip->addFile() 也会返回 TRUE。在对其调用 $zip->addFile() 之前,最好使用 file_exists() 或 is_readable() 检查每个文件。
javier dot santacruz at avature dot net
8 年前
ZipArchive.close() 在 PHP7 中改变了其行为。该函数在 PHP5 中忽略目录,但在 PHP7 中会失败,并出现以下错误:

意外的 PHP 错误 [ZipArchive::close(): 读取错误:是目录]

以下代码在 PHP5 中有效,但在 PHP7 中无效

<?php
// test.php
$zip = new ZipArchive();
$zip->open('/tmp/test.zip', ZipArchive::CREATE);
$zip->addFile('.', '.');
$ret = $zip->close();
echo
"Closed with: " . ($ret ? "true" : "false") . "\n";
?>

对于 php5

php --version
PHP 5.5.38-1-avature-ondrej-fork (cli) (built: Aug 31 2016 16:37:38)

php test.php
Closed with: true

对于 php7

php --version
PHP 7.0.8-0ubuntu0.16.04.2 (cli) ( NTS )

php test.php
Closed with: false
m021 at springtimesoftware dot com
13 年前
如果您创建了一个压缩文件并向其中添加了一个文件,但没有错误,但 ZipArchive::close 调用失败(出现 ER_TMPOPEN: "无法创建临时文件")并且未创建压缩文件,请检查您的 ZipArchive::open 调用是否指定了包含不存在目录的路径名。如果您期望包含一个或多个目录的层次结构,则必须在使用 ZipArchive 之前自行创建这些目录。您可以编写一个简单的函数,使用 dirname 递归查找每个父目录,并在退出递归时使用 mkdir 创建不存在的目录。
luciandex
2 年前
我不确定,但似乎如果在 $zip->open 中指定的路径是相对路径而不是绝对路径,则 $zip->close() 可能会遇到错误。
因此,在创建归档文件时,请为要创建的压缩文件指定绝对路径,而不是相对路径。
gilthans at gmail dot com
17 年前
不要忘记检查压缩文件是否为空,否则根本不会创建压缩文件,并且服务器不会发出任何警告!

我使用某个循环将文件添加到压缩文件中,并且在几个小时内苦苦挣扎于权限和文档,直到我意识到该循环最终没有添加任何文件,即使调用了 addFile,但它是在一个不存在的文件上调用的。
这可能是您的压缩文件没有出现的原因为。
valera at creator dot su
10 年前
请注意,ZipArchive::addFile() 只打开文件描述符,而不压缩它。只有 ZipArchive::close() 才会压缩文件,并且需要相当长的时间。请注意超时问题。
Clemens
1 年前
如果您在随机时间收到类似 "ZipArchive::close(): 重命名临时文件失败:权限被拒绝" 的错误,请检查您的防病毒软件(例如 Trellix),它可能会在扫描文件时阻止写入。在我的情况下,我不得不使用 flock 直到文件解锁。
To Top