(PECL rar >= 2.0.0)
RarArchive::open -- rar_open — 開啟 RAR 封存檔
物件導向風格 (方法)
$filename
, string $password
= NULL, callable $volume_callback
= NULL): RarArchive|false程序式風格
$filename
, string $password
= NULL, callable $volume_callback
= NULL): RarArchive|false開啟指定的 RAR 封存檔,並返回代表該封存檔的 RarArchive 實例。
注意事項:
如果開啟的是多卷封存檔,第一卷的檔案路徑應該作為第一個參數傳遞。否則,並非所有檔案都會顯示。這是設計使然。
filename
RAR 封存檔的路徑。
password
用於解密標頭的純文字密碼(如果需要)。如果找到加密檔案,預設也會使用此密碼。請注意,檔案的標頭和檔案本身可能使用不同的密碼。
volume_callback
一個接收一個參數(找不到的卷的檔案路徑)的函式,並返回包含該卷正確路徑的字串,如果該卷不存在或未知,則返回 null
。程式設計師應確保傳遞的函式不會導致迴圈,因為如果先前呼叫中返回的路徑與所需的卷不符,則會重複呼叫此函式。指定此參數會省略在找不到卷時發出的通知;因此,僅返回 null
的實作可以用於僅省略此類通知。
在 2.0.0 版之前,此函式無法正確處理相對路徑。請使用 realpath() 作為解決方法。
返回請求的 RarArchive 實例,如果失敗則返回 false
。
版本 | 說明 |
---|---|
PECL rar 3.0.0 |
新增了 volume_callback 參數。 |
範例 #1 物件導向風格
<?php
$rar_arch = RarArchive::open('encrypted_headers.rar', 'samplepassword');
if ($rar_arch === FALSE)
die("無法開啟檔案");
$entries = $rar_arch->getEntries();
if ($entries === FALSE)
die("無法取得檔案列表");
echo "找到 " . count($entries) . " 個檔案。\n";
if (empty($entries))
die("找不到有效的檔案項目。");
$stream = reset($entries)->getStream();
if ($stream === FALSE)
die("無法開啟第一個檔案");
$rar_arch->close();
echo "第一個檔案的內容如下:\n";
echo stream_get_contents($stream);
fclose($stream);
?>
以上範例的輸出會類似於
Found 2 files. Content of first one follows: Encrypted file 1 contents.
範例 #2 程序式風格
<?php
$rar_arch = rar_open('encrypted_headers.rar', 'samplepassword');
if ($rar_arch === FALSE)
die("無法開啟檔案");
$entries = rar_list($rar_arch);
if ($entries === FALSE)
die("無法取得檔案列表");
echo "找到 " . count($entries) . " 個檔案。\n";
if (empty($entries))
die("找不到有效的檔案項目。");
$stream = reset($entries)->getStream();
if ($stream === FALSE)
die("無法開啟第一個檔案");
rar_close($rar_arch);
echo "第一個檔案的內容如下:\n";
echo stream_get_contents($stream);
fclose($stream);
?>
範例 #3 磁碟區回呼
<?php
/* 在這個例子中,有一個名為 multi_broken.part1.rar 的分割壓縮檔
* 其下一個分割壓縮檔名為 multi.part2.rar */
function resolve($vol) {
if (preg_match('/_broken/', $vol))
return str_replace('_broken', '', $vol);
else
return null;
}
$rar_file1 = rar_open(dirname(__FILE__).'/multi_broken.part1.rar', null, 'resolve');
$entry = $rar_file1->getEntry('file2.txt');
$entry->extract(null, dirname(__FILE__) . "/temp_file2.txt");
?>