在PHP 中處理ZIP 文件時, zip_read()函數是讀取ZIP 文件條目的常用方法。但在解壓包含空目錄的ZIP 文件時,很多開發者會遇到空目錄丟失的問題。這是因為空目錄本身沒有文件, zip_read()默認只遍歷文件條目,而忽略了目錄條目,導致空目錄無法被正確創建。
本文將結合示例代碼,詳細介紹如何利用zip_read()函數正確識別和解壓空目錄,避免空目錄丟失,保證解壓後的文件結構完整。
ZIP 文件的條目既包括文件也包括目錄,目錄條目通常以/結尾。 zip_read()返回的條目名稱中,如果以/結尾,則表示這是一個目錄。普通解壓時,如果只創建文件對應目錄,卻不處理空目錄條目,空目錄就會被忽略。
下面是一個基於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);
?>
判斷目錄條目:利用zip_entry_name()獲取條目名稱,目錄條目一般以/結尾。
創建空目錄:遇到目錄條目,直接創建對應目錄。
創建文件及其父目錄:對於文件條目,先確保父目錄存在,再寫入文件內容。
權限和遞歸創建: mkdir()的第三個參數設置為true ,遞歸創建多級目錄。
更多關於PHP Zip 函數的文檔,可參考官方手冊: