如果 PHP 脚本在文件夹中没有写入权限,所有这些示例都无法正常工作。
虽然您可能会说这是显而易见的,但我发现,在这种情况下,$zip->open("name", ZIPARCHIVE::CREATE) 不会返回错误,因为它可能不会尝试访问文件系统,而是分配内存。
只有 $zip->close() 会返回错误。这可能会导致您在错误的端点进行搜索。
示例 #1 创建一个 Zip 归档文件
<?php
$zip = new ZipArchive();
$filename = "./test112.zip";
if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
exit("无法打开 <$filename>\n");
}
$zip->addFromString("testfilephp.txt" . time(), "#1 这是一个作为 testfilephp.txt 添加的测试字符串。\n");
$zip->addFromString("testfilephp2.txt" . time(), "#2 这是一个作为 testfilephp2.txt 添加的测试字符串。\n");
$zip->addFile($thisdir . "/too.php","/testfromfile.php");
echo "文件数量: " . $zip->numFiles . "\n";
echo "状态: " . $zip->status . "\n";
$zip->close();
?>
示例 #2 转储归档文件详细信息和列表
<?php
$za = new ZipArchive();
$za->open('test_with_comment.zip');
print_r($za);
var_dump($za);
echo "文件数量: " . $za->numFiles . "\n";
echo "状态: " . $za->status . "\n";
echo "系统状态: " . $za->statusSys . "\n";
echo "文件名: " . $za->filename . "\n";
echo "注释: " . $za->comment . "\n";
for ($i=0; $i<$za->numFiles;$i++) {
echo "索引: $i\n";
print_r($za->statIndex($i));
}
echo "文件数量: " . $za->numFiles . "\n";
?>
示例 #3 Zip 流包装器,读取 OpenOffice 元信息
<?php
$reader = new XMLReader();
$reader->open('zip://' . dirname(__FILE__) . '/test.odt#meta.xml');
$odt_meta = array();
while ($reader->read()) {
if ($reader->nodeType == XMLREADER::ELEMENT) {
$elm = $reader->name;
} else {
if ($reader->nodeType == XMLREADER::END_ELEMENT && $reader->name == 'office:meta') {
break;
}
if (!trim($reader->value)) {
continue;
}
$odt_meta[$elm] = $reader->value;
}
}
print_r($odt_meta);
?>
此示例使用旧的 API(PHP 4),它打开一个 ZIP 文件归档文件,读取归档文件中的每个文件,并打印出其内容。在本示例中使用的 test2.zip 归档文件是 ZZIPlib 源代码分发版中的一个测试归档文件。
示例 #4 Zip 使用示例
<?php
$zip = zip_open("/tmp/test2.zip");
if ($zip) {
while ($zip_entry = zip_read($zip)) {
echo "Name: " . zip_entry_name($zip_entry) . "\n";
echo "Actual Filesize: " . zip_entry_filesize($zip_entry) . "\n";
echo "Compressed Size: " . zip_entry_compressedsize($zip_entry) . "\n";
echo "Compression Method: " . zip_entry_compressionmethod($zip_entry) . "\n";
if (zip_entry_open($zip, $zip_entry, '"r"')) {
echo "File Contents:\n";
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
echo '"$buf"\n"';
zip_entry_close($zip_entry);
}
echo "\n";
}
zip_close($zip);
}
?>
如果 PHP 脚本在文件夹中没有写入权限,所有这些示例都无法正常工作。
虽然您可能会说这是显而易见的,但我发现,在这种情况下,$zip->open("name", ZIPARCHIVE::CREATE) 不会返回错误,因为它可能不会尝试访问文件系统,而是分配内存。
只有 $zip->close() 会返回错误。这可能会导致您在错误的端点进行搜索。
您可以使用此代码读取 JAR 文件(Java 存档)。
JAR 文件使用相同的 ZIP 格式,因此可以轻松读取。
$zf = zip_open(realpath('D:/lucene/allinone/lucene-core.jar')); $i=1;
while($zf && $ze = zip_read($zf)) {
$zi[$i]['zip entry name']= zip_entry_name($ze);
$zi[$i]['zip entry filesize']= zip_entry_filesize($ze);
$zi[$i]['zip entry compressed size']= zip_entry_compressedsize($ze);
$zi[$i]['zip entry compression method']= zip_entry_compressionmethod($ze);
$zi[$i]['zip entry open status'] = zip_entry_open($zf,$ze);
//$zi[$i]['zip entry file contents'] = zip_entry_read($ze,100);
$i++;
}
print_r($zi);
zip_close($zf);
<?php
$zip = new ZipArchive;
$zip->open('teste.zip');
$zip->extractTo('./');
$zip->close();
echo "Ok!";
?>
1) 如果您想将文件添加到 ZIP 存档,但您不知道 ZIP 文件是否存在,则必须检查:这会改变您打开它的方式!.
2) 您不能追加多个标志,只能使用一个(或没有)。
如果 zip 不存在,请使用以下方式打开它:
$ziph->open($archiveFile, ZIPARCHIVE::CM_PKWARE_IMPLODE)
(或其他压缩方法)
如果 zip 已存在,请使用以下方式打开它:
$ziph->open($archiveFile)
或
$ziph->open($archiveFile, ZIPARCHIVE::CHECKCONS)
示例:每小时制作备份文件并将它们全部 ZIP 到每日 ZIP 存档中,因此您每天只想要获取一个 ZIP,每个 ZIP 包含 24 个文件。
<?php
function archivebackup($archiveFile, $file, &$errMsg)
{
$ziph = new ZipArchive();
if(file_exists($archiveFile))
{
if($ziph->open($archiveFile, ZIPARCHIVE::CHECKCONS) !== TRUE)
{
$errMsg = "无法打开 $archiveFile";
return 1;
}
}
else
{
if($ziph->open($archiveFile, ZIPARCHIVE::CM_PKWARE_IMPLODE) !== TRUE)
{
$errMsg = "无法创建 $archiveFile";
return 1;
}
}
if(!$ziph->addFile($file))
{
$errMsg = "将 $file 存档到 $archiveFile 时出错";
return 2;
}
$ziph->close();
return 0;
}
?>