如果 PHP 腳本沒有資料夾的寫入權限,所有這些範例都將無法運作。
雖然您可能會說這是顯而易見的,但我發現,在這種情況下,$zip->open("name", ZIPARCHIVE::CREATE) 並不會返回錯誤,因為它可能不會嘗試存取檔案系統,而是配置記憶體。
只有 $zip->close() 會返回錯誤。這可能會導致您在錯誤的地方尋找問題。
範例 #1 建立 Zip 封存檔
<?php
$zip = new ZipArchive();
$filename = "./test112.zip";
if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
exit("無法開啟 <$filename>\n");
}
$zip->addFromString("testfilephp.txt" . time(), "#1 這是作為 testfilephp.txt 加入的測試字串。\n");
$zip->addFromString("testfilephp2.txt" . time(), "#2 這是作為 testfilephp2.txt 加入的測試字串。\n");
$zip->addFile($thisdir . "/too.php","/testfromfile.php");
echo "檔案數量: " . $zip->numFiles . "\n";
echo "狀態:" . $zip->status . "\n";
$zip->close();
?>
範例 #2 傾印壓縮檔細節和列表
<?php
$za = new ZipArchive();
$za->open('test_with_comment.zip');
print_r($za);
var_dump($za);
echo "檔案數量: " . $za->numFiles . "\n";
echo "狀態: " . $za->status . "\n";
echo "系統狀態: " . $za->statusSys . "\n";
echo "檔案名稱: " . $za->filename . "\n";
echo "註解: " . $za->comment . "\n";
for ($i=0; $i<$za->numFiles;$i++) {
echo "索引: $i\n";
print_r($za->statIndex($i));
}
echo "檔案數量:" . $za->numFiles . "\n";
?>
範例 #3 Zip 資料流包裝器,讀取 OpenOffice 中繼資訊
<?php
$reader = new XMLReader();
$reader->open('zip://' . dirname(__FILE__) . '/test.odt#meta.xml');
$odt_meta = array();
while ($reader->read()) {
if ($reader->nodeType == XMLREADER::ELEMENT) {
$elm = $reader->name;
} else {
if ($reader->nodeType == XMLREADER::END_ELEMENT && $reader->name == 'office:meta') {
break;
}
if (!trim($reader->value)) {
continue;
}
$odt_meta[$elm] = $reader->value;
}
}
print_r($odt_meta);
?>
這個範例使用舊的 API (PHP 4),它開啟一個 ZIP 檔案壓縮檔,讀取壓縮檔中的每個檔案並印出其內容。此範例中使用的 test2.zip 壓縮檔是 ZZIPlib 原始碼發佈版本中的測試壓縮檔之一。
範例 #4 Zip 使用範例
<?php
$zip = zip_open("/tmp/test2.zip");
if ($zip) {
while ($zip_entry = zip_read($zip)) {
echo "名稱: " . zip_entry_name($zip_entry) . "\n";
echo "實際檔案大小: " . zip_entry_filesize($zip_entry) . "\n";
echo "壓縮後大小: " . zip_entry_compressedsize($zip_entry) . "\n";
echo "壓縮方法: " . zip_entry_compressionmethod($zip_entry) . "\n";
if (zip_entry_open($zip, $zip_entry, "r")) {
echo "檔案內容:\n";
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
echo "$buf\n";
zip_entry_close($zip_entry);
}
echo "\n";
}
zip_close($zip);
}
?>
如果 PHP 腳本沒有資料夾的寫入權限,所有這些範例都將無法運作。
雖然您可能會說這是顯而易見的,但我發現,在這種情況下,$zip->open("name", ZIPARCHIVE::CREATE) 並不會返回錯誤,因為它可能不會嘗試存取檔案系統,而是配置記憶體。
只有 $zip->close() 會返回錯誤。這可能會導致您在錯誤的地方尋找問題。
您可以使用以下程式碼來讀取 JAR 檔案(Java 封存檔)
JAR 檔案使用與 ZIP 相同的格式,因此可以輕鬆讀取
$zf = zip_open(realpath('D:/lucene/allinone/lucene-core.jar')); $i=1;
while($zf && $ze = zip_read($zf)) {
$zi[$i]['zip 項目名稱'] = zip_entry_name($ze);
$zi[$i]['zip 項目檔案大小'] = zip_entry_filesize($ze);
$zi[$i]['zip 項目壓縮後大小'] = zip_entry_compressedsize($ze);
$zi[$i]['zip 項目壓縮方法'] = zip_entry_compressionmethod($ze);
$zi[$i]['zip 項目開啟狀態'] = zip_entry_open($zf,$ze);
//$zi[$i]['zip 項目檔案內容'] = zip_entry_read($ze,100);
$i++;
}
print_r($zi);
zip_close($zf);
<?php
$zip = new ZipArchive;
$zip->open('teste.zip');
$zip->extractTo('./');
$zip->close();
echo "Ok!";
?>
1) 如果您想將檔案添加到 ZIP 封存檔,但不確定 ZIP 檔案是否存在,您必須檢查:這會改變您開啟它的方式!
2) 您不能附加多個標記,只能使用一個(或不使用)。
如果 zip 檔案不存在,請使用以下方式開啟:
$ziph->open($archiveFile, ZIPARCHIVE::CM_PKWARE_IMPLODE)
(或其他壓縮方法)
如果 zip 檔案已存在,請使用以下方式開啟:
$ziph->open($archiveFile)
或
$ziph->open($archiveFile, ZIPARCHIVE::CHECKCONS)
範例:每小時製作備份檔案,並將它們全部壓縮到每日 ZIP 封存檔中,這樣您每天只會得到一個 ZIP 檔案,每個 ZIP 檔案包含 24 個檔案
<?php
函式 archivebackup($archiveFile, $file, &$errMsg)
{
$ziph = new ZipArchive();
if(file_exists($archiveFile))
{
if($ziph->open($archiveFile, ZIPARCHIVE::CHECKCONS) !== TRUE)
{
$errMsg = "無法開啟 $archiveFile";
return 1;
}
}
else
{
if($ziph->open($archiveFile, ZIPARCHIVE::CM_PKWARE_IMPLODE) !== TRUE)
{
$errMsg = "無法建立 $archiveFile";
return 1;
}
}
if(!$ziph->addFile($file))
{
$errMsg = "將 $file 存檔至 $archiveFile 時發生錯誤";
return 2;
}
$ziph->close();
return 0;
}
?>