在使用 PHP 处理 ZIP 文件时,zip_read 函数是一个常用的接口,用于逐条读取压缩包内的文件条目。然而,有时我们会遇到一些不需要的文件夹或文件条目,比如 macOS 系统生成的 __MACOSX 目录,或者其他隐藏文件。这些条目通常对我们业务逻辑没有意义,甚至可能干扰文件处理流程,因此需要在遍历时跳过它们。
本文将介绍如何在使用 zip_read 函数时,过滤掉这些特定文件条目。
下面是一个简单示例,展示如何打开一个 ZIP 文件,并遍历其中的文件条目:
<?php
$zipPath = 'example.zip';
$zip = zip_open($zipPath);
if ($zip) {
while ($zipEntry = zip_read($zip)) {
$entryName = zip_entry_name($zipEntry);
echo "Found entry: $entryName\n";
}
zip_close($zip);
} else {
echo "Failed to open ZIP file.";
}
?>
我们需要在遍历时判断当前条目的名称,排除掉以 __MACOSX 开头的文件夹以及类似的无效条目。
这里的关键是使用 PHP 的字符串函数 strpos 来检测条目名称的前缀:
<?php
$zipPath = 'example.zip';
$zip = zip_open($zipPath);
if ($zip) {
while ($zipEntry = zip_read($zip)) {
$entryName = zip_entry_name($zipEntry);
// 跳过 __MACOSX 文件夹下的所有条目
if (strpos($entryName, '__MACOSX/') === 0) {
continue;
}
// 还可以跳过其他不想处理的隐藏文件,比如 .DS_Store
if (basename($entryName) === '.DS_Store') {
continue;
}
// 正常处理的代码
echo "处理文件: $entryName\n";
// 可以打开条目进行读取操作,例如:
if (zip_entry_open($zip, $zipEntry)) {
$contents = zip_entry_read($zipEntry, zip_entry_filesize($zipEntry));
// 处理 $contents,例如保存文件
zip_entry_close($zipEntry);
}
}
zip_close($zip);
} else {
echo "无法打开 ZIP 文件";
}
?>
使用 zip_read 逐条读取 ZIP 条目时,检查条目名称。
利用 strpos 判断条目名是否以 __MACOSX/ 开头,跳过该目录下的所有文件。
同时,可以针对特定文件名(如 .DS_Store)进行过滤。
这样能有效避免处理无用的 macOS 系统文件,提高代码健壮性和效率。