rar:// — RAR
封裝協(xié)議采用 url 編碼,(相對(duì)/絕對(duì))路徑的 RAR 歸檔、一個(gè)可選的星號(hào)(*
)、一個(gè)可選的井號(hào)(#
)和一個(gè)可選的存儲(chǔ)在歸檔中的 url 編碼條目名稱(chēng)。指定條目名稱(chēng)必須帶有井號(hào),條目名稱(chēng)開(kāi)頭的斜線是可選的。
該封裝協(xié)議可以打開(kāi)文件和目錄。當(dāng)打開(kāi)目錄時(shí),星號(hào)會(huì)強(qiáng)制返回未編碼的目錄條目名稱(chēng)。如果不指定星號(hào),將返回 URL 編碼的目錄條目名稱(chēng) —— 這樣做的原因是存在類(lèi)似 URL 編碼的文件名時(shí),允許封裝協(xié)議能夠與內(nèi)置方法(比如 RecursiveDirectoryIterator)一起正確使用。
如果不包含井號(hào)和條目名稱(chēng)部分,將會(huì)顯示歸檔的根目錄。與常規(guī)目錄不同的是生成的流不會(huì)包含諸如修改時(shí)間之類(lèi)的信息, 因?yàn)楦夸洸粫?huì)存儲(chǔ)在歸檔的條目中。當(dāng)訪問(wèn)根目錄時(shí), RecursiveDirectoryIterator 與封裝協(xié)議一起使用時(shí)需要在 ULR 中包含井號(hào),以便正確構(gòu)建子級(jí) URL。
注意: 該封裝協(xié)議不會(huì)默認(rèn)啟用
為了使用 rar:// 封裝協(xié)議,必須從 ? PECL 中安裝可用的 ? rar 擴(kuò)展。
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";
}
?>
以上例程的輸出類(lèi)似于:
|-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 打開(kāi)加密文件(報(bào)頭加密)
<?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 中創(chuàng)建日期和最后訪問(wèn)日期是可選的,
* 因此大多數(shù)文件都沒(méi)有 */
var_dump(fstat($stream));
?>
以上例程的輸出類(lèi)似于:
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 )