(PECL rar >= 2.0.0)
RarArchive::open -- rar_open — Rar アーカイブをオープンする
オブジェクト指向型 (メソッド)
$filename
[, string $password
= NULL
[, callable $volume_callback
= NULL
]] ) : RarArchive手続き型:
$filename
[, string $password
= NULL
[, callable $volume_callback
= NULL
]] ) : RarArchive指定した RAR アーカイブをオープンし、RarArchive インスタンスを返します。
注意:
マルチボリュームのアーカイブをオープンするときには、 最初のボリュームのパスをパラメータに指定します。 そうしないとすべてのファイルを表示することはできません。これは仕様です。
filename
Rar アーカイブへのパス。
password
ヘッダの復号に必要な場合、プレーンテキストのパスワード。 暗号化されたファイルが見つかったときにも、これがデフォルトのパスワードとして使われます。 ヘッダのパスワードとファイルのパスワードは異なる場合があることに注意しましょう。
volume_callback
ひとつのパラメータ (見つからなかったボリュームのパス)
を受け取ってそのボリュームの正しいパスを返す関数。
この関数は、ボリュームが存在しなかったり未知であったりする場合は
NULL
を返さなければなりません。
この関数はループを引き起こさないようにしなければなりません。
前のコールで返されたパスがそのボリュームに対応しない場合に
関数が繰り返しコールされることがあるからです。
このパラメータを指定すると、ボリュームが見つからなかったときの
notice は一切無視するようになります。したがって、
単に NULL
を返すだけの実装を渡しておけば、
notice を無視させるためだけに使うこともできます。
バージョン 2.0.0 より前では、この関数は相対パスを正しく処理できません。 回避策として realpath() を使いましょう。
RarArchive インスタンスを返します。失敗した場合に FALSE
を返します。
バージョン | 説明 |
---|---|
3.0.0 |
volume_callback が追加されました。
|
例1 オブジェクト指向型
<?php
$rar_arch = RarArchive::open('encrypted_headers.rar', 'samplepassword');
if ($rar_arch === FALSE)
die("Failed opening file");
$entries = $rar_arch->getEntries();
if ($entries === FALSE)
die("Failed fetching entries");
echo "Found " . count($entries) . " files.\n";
if (empty($entries))
die("No valid entries found.");
$stream = reset($entries)->getStream();
if ($stream === FALSE)
die("Failed opening first file");
$rar_arch->close();
echo "Content of first one follows:\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("Failed opening file");
$entries = rar_list($rar_arch);
if ($entries === FALSE)
die("Failed fetching entries");
echo "Found " . count($entries) . " files.\n";
if (empty($entries))
die("No valid entries found.");
$stream = reset($entries)->getStream();
if ($stream === FALSE)
die("Failed opening first file");
rar_close($rar_arch);
echo "Content of first one follows:\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");
?>