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

# RarArchive::open

# rar_open

(PECL rar >= 2.0.0)

RarArchive::open -- rar_open — Rar アーカイブをオープンする

### 説明

オブジェクト指向型 (メソッド)

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

手続き型:

function rar_open(string `$filename`, string `$password` = NULL, callable `$volume_callback` = NULL): RarArchive|false

指定した RAR アーカイブをオープンし、RarArchive インスタンスを返します。

> 注意: マルチボリュームのアーカイブをオープンするときには、 最初のボリュームのパスをパラメータに指定します。 そうしないとすべてのファイルを表示することはできません。これは仕様です。

### パラメータ

`filename`
  Rar アーカイブへのパス。
`password`
  ヘッダの復号に必要な場合、プレーンテキストのパスワード。 暗号化されたファイルが見つかったときにも、これがデフォルトのパスワードとして使われます。 ヘッダのパスワードとファイルのパスワードは異なる場合があることに注意しましょう。
`volume_callback`
  ひとつのパラメータ (見つからなかったボリュームのパス) を受け取ってそのボリュームの正しいパスを返す関数。 この関数は、ボリュームが存在しなかったり未知であったりする場合は `null` を返さなければなりません。 この関数はループを引き起こさないようにしなければなりません。 前のコールで返されたパスがそのボリュームに対応しない場合に 関数が繰り返しコールされることがあるからです。 このパラメータを指定すると、ボリュームが見つからなかったときの notice は一切無視するようになります。したがって、 単に `null` を返すだけの実装を渡しておけば、 notice を無視させるためだけに使うこともできます。

警告

バージョン 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("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

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open