在使用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 系統文件,提高代碼健壯性和效率。