rar:// — RAR
此包裝器接受 RAR 封存檔的 URL 編碼路徑(相對或絕對),一個可選的星號 (*
),一個可選的井字號 (#
) 以及一個可選的 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()) ? " [資料夾]" : "");
}
}
$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 )