2024 年 PHP 日本研討會

rar://

rar://RAR

說明

此包裝器接受 RAR 封存檔的 URL 編碼路徑(相對或絕對),一個可選的星號 (*),一個可選的井字號 (#) 以及一個可選的 URL 編碼項目名稱,如同儲存在封存檔中一樣。指定項目名稱需要井字號;項目名稱中的前斜線是可選的。

此包裝器可以開啟檔案和目錄。開啟目錄時,星號會強制目錄項目名稱以未編碼的方式返回。如果未指定,它們將以 URL 編碼的方式返回——這樣做的原因是允許包裝器在存在看起來像 URL 編碼資料的檔案名稱時,能與內建功能(例如 RecursiveDirectoryIterator)正確地一起使用。

如果省略井字號 (#) 和項目名稱部分,則會顯示壓縮檔的根目錄。這與一般目錄不同,因為產生的串流不會包含修改時間等資訊,因為根目錄並未儲存在壓縮檔的個別項目中。搭配 RecursiveDirectoryIterator 使用此包裝器時,存取根目錄的 URL 中需要包含井字號,以便正確建構子項目的 URL。

注意此包裝器預設並未啟用
要使用 rar:// 包裝器,必須安裝從 » PECL 取得的 » rar 擴充功能。

rar:// 自 PECL rar 3.0.0 起可用

用法

  • rar://<URL 編碼的壓縮檔名稱>[*][#[<URL 編碼的項目名稱>]]

選項

包裝器摘要
屬性 支援
allow_url_fopen 限制
allow_url_include 限制
允許讀取
允許寫入
允許附加
允許同時讀寫
支援 stat()
支援 unlink()
支援 rename()
支援 mkdir()
支援 rmdir()

上下文選項
名稱 用法 預設值
open_password 用於加密壓縮檔標頭的密碼(如果有的話)。如果存在標頭密碼,WinRAR 會使用與標頭密碼相同的密碼加密所有檔案,因此對於具有加密標頭的壓縮檔,將忽略 file_password  
file_password 用於加密檔案的密碼(如果有的話)。如果標頭也已加密,則此選項將被忽略,而採用 open_password。之所以有兩個選項,是為了涵蓋支援具有不同標頭和檔案密碼的壓縮檔的可能性,以防出現此類壓縮檔。請注意,如果壓縮檔的標頭未加密,則 open_password 將被忽略,而必須改用此選項。  
volume_callback 用於決定遺失卷冊路徑的回呼函式。詳情請參閱 RarArchive::open()  

範例

範例 #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
)
新增註解

使用者貢獻的註解

此頁面沒有使用者貢獻的註解。
To Top