當前位置: 首頁> 最新文章列表> 如何使用zip_read() 函數正確解壓包含空目錄的Zip 文件,避免空目錄丟失問題?

如何使用zip_read() 函數正確解壓包含空目錄的Zip 文件,避免空目錄丟失問題?

M66 2025-07-18

在PHP 中處理ZIP 文件時, zip_read()函數是讀取ZIP 文件條目的常用方法。但在解壓包含空目錄的ZIP 文件時,很多開發者會遇到空目錄丟失的問題。這是因為空目錄本身沒有文件, zip_read()默認只遍歷文件條目,而忽略了目錄條目,導致空目錄無法被正確創建。

本文將結合示例代碼,詳細介紹如何利用zip_read()函數正確識別和解壓空目錄,避免空目錄丟失,保證解壓後的文件結構完整。


1. 問題分析

ZIP 文件的條目既包括文件也包括目錄,目錄條目通常以/結尾。 zip_read()返回的條目名稱中,如果以/結尾,則表示這是一個目錄。普通解壓時,如果只創建文件對應目錄,卻不處理空目錄條目,空目錄就會被忽略。


2. 示例代碼演示

下面是一個基於PHP 原生ZIP 函數的示例,演示如何讀取ZIP 文件,區分文件和目錄,並正確創建空目錄。

 <?php
$zipPath = 'archive.zip'; // ZIP 文件路徑
$extractTo = 'output/';   // 解壓目標目錄

$zip = zip_open($zipPath);
if (!is_resource($zip)) {
    die("無法打開 ZIP 文件\n");
}

while ($entry = zip_read($zip)) {
    $entryName = zip_entry_name($entry);

    // 判斷是否目錄條目,目錄條目以 '/' 結尾
    if (substr($entryName, -1) === '/') {
        // 創建空目錄
        $dirPath = $extractTo . $entryName;
        if (!is_dir($dirPath)) {
            mkdir($dirPath, 0755, true);
            echo "創建空目錄:$dirPath\n";
        }
    } else {
        // 文件條目,先確保目錄存在
        $filePath = $extractTo . $entryName;
        $dir = dirname($filePath);
        if (!is_dir($dir)) {
            mkdir($dir, 0755, true);
        }

        // 讀取文件內容並寫入
        if (zip_entry_open($zip, $entry)) {
            $fp = fopen($filePath, 'w');
            while ($data = zip_entry_read($entry, 1024)) {
                fwrite($fp, $data);
            }
            fclose($fp);
            zip_entry_close($entry);
            echo "解壓文件:$filePath\n";
        }
    }
}

zip_close($zip);
?>

3. 關鍵點總結

  • 判斷目錄條目:利用zip_entry_name()獲取條目名稱,目錄條目一般以/結尾。

  • 創建空目錄:遇到目錄條目,直接創建對應目錄。

  • 創建文件及其父目錄:對於文件條目,先確保父目錄存在,再寫入文件內容。

  • 權限和遞歸創建mkdir()的第三個參數設置為true ,遞歸創建多級目錄。


4. 相關鏈接

更多關於PHP Zip 函數的文檔,可參考官方手冊: