サポートするプロトコル/ラッパー
PHP Manual

rar://

rar://RAR

説明

このラッパーが受け取るのは、RAR アーカイブへの URL エンコードされたパス (絶対パスあるいは相対パス)、そしてオプションでアスタリスク (*)、番号記号 (#)、 アーカイブ内のエントリ名です。エントリ名を指定する場合は番号記号が必須となります。 エントリ名の先頭のスラッシュは必須ではありません。

このラッパーは、ファイルだけでなくディレクトリも開くことができます。 ディレクトリを開く際にアスタリスクを使うと、 返されるディレクトリエントリ名はエンコードされていない状態となります。 アスタリスクを指定しなかった場合は URL エンコードしたものを返します。 これは、RecursiveDirectoryIterator などの組み込み機能で このラッパーをファイル名の代わりに正しく使えるようにするためです。

番号記号とエントリ名の部分が含まれていない場合は、アーカイブのルートを表示します。 これは通常のディレクトリとは異なり、 返されるストリームには更新時刻などの情報が含まれません。 ルートディレクトリは、アーカイブの個別のエントリとして存在するわけではないからです。 このラッパーを RecursiveDirectoryIterator で使う場合、 ルートにアクセスするには URL に番号記号を含めなければなりません。 そうすれば、子要素の URL も正しく作られます。

注意: このラッパーはデフォルトでは有効になっていません
rar:// ラッパーを使用するには、 » PECL から » rar 拡張モジュールを インストールする必要があります。

rar:// は、PECL rar 3.0.0 以降で使用可能です。

利用法

オプション

ラッパーの概要
属性 サポートの有無
allow_url_fopen で制約される No
allow_url_include で制約される No
読み込み許可 Yes
書き込み許可 No
追加許可 No
同時読み書き許可 No
stat() のサポート Yes
unlink() のサポート No
rename() のサポート No
mkdir() のサポート No
rmdir() のサポート No

コンテキストオプション
名前 使用法 デフォルト
open_password アーカイブのヘッダを暗号化するときに使うパスワード。 WinRAR では、ヘッダの暗号が設定されている場合はすべてのファイルを同じパスワードで暗号化します。 そのため、ヘッダが暗号化されているアーカイブでは file_password は無視されます。  
file_password ファイルを暗号化するときに使うパスワード。 ヘッダが暗号化されている場合はこの設定は無視され、かわりに open_password の値を使います。 ふたつのオプションがある理由は、 ヘッダとファイルを別々のパスワードで暗号化する可能性に対応するためです。 アーカイブのヘッダが暗号化されていない場合は open_password は無視され、 このオプションを使わなければならないことに注意しましょう。  
volume_callback 存在しないボリュームのパスを決めるために使うコールバック。詳細は RarArchive::open() を参照ください。  

例1 RAR アーカイブの走査

<?php

class MyRecDirIt extends RecursiveDirectoryIterator {
    function 
current() {
        return 
rawurldecode($this->getSubPathName()) .
            (
is_dir(parent::current())?" [DIR]":"");
    }
}

$f "rar://" rawurlencode(dirname(__FILE__)) .
    
DIRECTORY_SEPARATOR 'dirs_and_extra_headers.rar#';

$it = new RecursiveTreeIterator(new MyRecDirIt($f));

foreach (
$it as $s) {
    echo 
$s"\n";
}
?>

上の例の出力は、 たとえば以下のようになります。

|-allow_everyone_ni [DIR]
|-file1.txt
|-file2_אּ.txt
|-with_streams.txt
\-אּ [DIR]
  |-אּ\%2Fempty%2E [DIR]
  | \-אּ\%2Fempty%2E\file7.txt
  |-אּ\empty [DIR]
  |-אּ\file3.txt
  |-אּ\file4_אּ.txt
  \-אּ\אּ_2 [DIR]
    |-אּ\אּ_2\file5.txt
    \-אּ\אּ_2\file6_אּ.txt

例2 暗号化されたファイルのオープン (ヘッダの暗号化)

<?php
$stream 
fopen("rar://" .
    
rawurlencode(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
    
'encrypted_headers.rar' '#encfile1.txt'"r"false,
    
stream_context_create(
        array(
            
'rar' =>
                array(
                    
'open_password' => 'samplepassword'
                
)
            )
        )
    );
var_dump(stream_get_contents($stream));
/* 作成日や最終更新日は WinRAR では選択式になっています。
 * そのため、多くのファイルには含まれていません */
var_dump(fstat($stream));
?>

上の例の出力は、 たとえば以下のようになります。

string(26) "Encrypted file 1 contents."
Array
(
    [0] => 0
    [1] => 0
    [2] => 33206
    [3] => 1
    [4] => 0
    [5] => 0
    [6] => 0
    [7] => 26
    [8] => 0
    [9] => 1259550052
    [10] => 0
    [11] => -1
    [12] => -1
    [dev] => 0
    [ino] => 0
    [mode] => 33206
    [nlink] => 1
    [uid] => 0
    [gid] => 0
    [rdev] => 0
    [size] => 26
    [atime] => 0
    [mtime] => 1259550052
    [ctime] => 0
    [blksize] => -1
    [blocks] => -1
)

サポートするプロトコル/ラッパー
PHP Manual