Rar アーカイブをオープンする

# 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

手続き型:

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

### 参考

- rar:// wrapper