rar://

rar://RAR

描述

包装器使用 URL 编码的路径指向 RAR 存档(相对或绝对),一个可选的星号 (*),一个可选的井号 (#) 和一个可选的 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())?" [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
)
添加一个备注

用户贡献的注释

此页面没有用户贡献的注释。
To Top