rar:// — RAR
包装器使用 URL 编码的路径指向 RAR 存档(相对或绝对),一个可选的星号 (*
),一个可选的井号 (#
) 和一个可选的 URL 编码的条目名称,如存档中存储的那样。指定条目名称需要井号;条目名称中的前导斜杠是可选的。
此包装器可以打开文件和目录。打开目录时,星号强制返回目录条目名称未编码。如果没有指定,它们将以 URL 编码形式返回 - 这样做的原因是允许包装器在存在看似 URL 编码数据的文件名的情况下,与内置功能(如 RecursiveDirectoryIterator)一起正确使用。
如果未包含井号和条目名称部分,则将显示存档的根目录。这与普通目录不同,因为结果流将不包含修改时间等信息,因为根目录没有存储在存档中的单个条目中。使用包装器 RecursiveDirectoryIterator 需要在访问根目录时在 URL 中包含井号,以便可以正确构建子级的 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 )