rar:// — RAR
このラッパーが受け取るのは、RAR アーカイブへの URL エンコードされたパス (絶対パスあるいは相対パス)、そしてオプションでアスタリスク (*)、番号記号 (#)、 アーカイブ内のエントリ名です。エントリ名を指定する場合は番号記号が必須となります。 エントリ名の先頭のスラッシュは必須ではありません。
このラッパーは、ファイルだけでなくディレクトリも開くことができます。 ディレクトリを開く際にアスタリスクを使うと、 返されるディレクトリエントリ名はエンコードされていない状態となります。 アスタリスクを指定しなかった場合は URL エンコードしたものを返します。 これは、RecursiveDirectoryIterator などの組み込み機能で このラッパーをファイル名の代わりに正しく使えるようにするためです。
番号記号とエントリ名の部分が含まれていない場合は、アーカイブのルートを表示します。 これは通常のディレクトリとは異なり、 返されるストリームには更新時刻などの情報が含まれません。 ルートディレクトリは、アーカイブの個別のエントリとして存在するわけではないからです。 このラッパーを RecursiveDirectoryIterator で使う場合、 ルートにアクセスするには URL に番号記号を含めなければなりません。 そうすれば、子要素の URL も正しく作られます。
注意: このラッパーはデフォルトでは有効になっていません
rar:// ラッパーを使用するには、 » PECL から » rar 拡張モジュールを インストールする必要があります。
rar:// は、PECL rar 3.0.0 以降で使用可能です。
例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 )