當前位置: 首頁> 最新文章列表> 使用zip_read 函數時,如何跳過__MACOSX 等特定的文件條目?

使用zip_read 函數時,如何跳過__MACOSX 等特定的文件條目?

M66 2025-06-12

在使用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 及其他指定文件夾或文件

我們需要在遍歷時判斷當前條目的名稱,排除掉以__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 系統文件,提高代碼健壯性和效率。