rar:// — RAR
此包装器接受 URL 编码的 RAR 归档路径(相对或绝对)、一个可选星号(*)、一个可选井号(#)和一个可选的 URL 编码的条目名称(存储在归档中)。指定条目名称需要井号;条目名称中的前导斜杠是可选的。
此包装器可以打开文件和目录。打开目录时,星号会强制返回未编码的目录条目名称。如果未指定,则将返回 URL 编码的名称——这样做的原因是为了允许包装器与内置功能(例如 RecursiveDirectoryIterator)一起正确使用,即使文件名看起来像 URL 编码的数据。
如果没有包含井号和条目名称部分,则将显示归档的根目录。这与普通目录不同,因为生成的流不包含修改时间等信息,因为根目录未存储在归档中的单个条目中。使用此包装器和 RecursiveDirectoryIterator 需要在访问根目录时包含井号,以便可以正确构造子项的 URL。
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));
/* creation and last access date is opt-in in WinRAR, hence most
* files don't have them */
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
)