PHP Conference Japan 2024

RarArchive::open

rar_open

(PECL rar >= 2.0.0)

RarArchive::open -- rar_open開啟 RAR 封存檔

說明

物件導向風格 (方法)

public static RarArchive::open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false

程序式風格

rar_open(string $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");
?>

另請參閱

新增註釋

使用者貢獻的註釋

此頁面沒有使用者貢獻的註釋。
To Top