(PECL rar >= 2.0.0)
RarArchive::open -- rar_open — 打开 RAR 档案
面向对象风格(方法)
$filename
, string $password
= NULL, callable $volume_callback
= NULL): RarArchive|false过程式风格
$filename
, string $password
= NULL, callable $volume_callback
= NULL): RarArchive|false打开指定的 RAR 档案并返回表示它的 RarArchive 实例。
注意:
如果打开多卷档案,则应将第一个卷的路径作为第一个参数传递。否则,将不会显示所有文件。这是设计使然。
filename
Rar 档案的路径。
password
一个纯文本密码,如果需要解密标题,则需要此密码。如果找到加密文件,它也将默认使用。请注意,文件可能具有与标题不同的密码,以及它们之间不同的密码。
volume_callback
一个接收一个参数的函数 - 找不到的卷的路径 - 并返回一个字符串,其中包含该卷的正确路径,或者如果该卷不存在或未知,则返回 null
。程序员应确保传递的函数不会导致循环,因为如果先前调用中返回的路径与所需卷不对应,则会反复调用此函数。指定此参数将省略在找不到卷时发出的通知;因此,只返回 null
的实现可用于简单地省略这些通知。
在 2.0.0 版之前,此函数不会正确处理相对路径。请使用 realpath() 作为解决方法。
返回请求的 RarArchive 实例,或在失败时返回 false
。
版本 | 描述 |
---|---|
PECL rar 3.0.0 |
添加了 volume_callback 。 |
示例 #1 面向对象风格
<?php
$rar_arch = RarArchive::open('encrypted_headers.rar', 'samplepassword');
if ($rar_arch === FALSE)
die("打开文件失败");
$entries = $rar_arch->getEntries();
if ($entries === FALSE)
die("获取条目失败");
echo "找到 " . count($entries) . " 个文件。\n";
if (empty($entries))
die("未找到有效条目。");
$stream = reset($entries)->getStream();
if ($stream === FALSE)
die("打开第一个文件失败");
$rar_arch->close();
echo "第一个文件的内容如下:\n";
echo stream_get_contents($stream);
fclose($stream);
?>
上面的示例将输出类似以下内容
Found 2 files. Content of first one follows: Encrypted file 1 contents.
示例 #2 过程式风格
<?php
$rar_arch = rar_open('encrypted_headers.rar', 'samplepassword');
if ($rar_arch === FALSE)
die("打开文件失败");
$entries = rar_list($rar_arch);
if ($entries === FALSE)
die("获取条目失败");
echo "找到 " . count($entries) . " 个文件。\n";
if (empty($entries))
die("未找到有效条目。");
$stream = reset($entries)->getStream();
if ($stream === FALSE)
die("打开第一个文件失败");
rar_close($rar_arch);
echo "第一个文件的内容如下:\n";
echo stream_get_contents($stream);
fclose($stream);
?>
示例 #3 卷回调
<?php
/* 此示例中,有一个名为 multi_broken.part1.rar 的卷,
* 其下一个卷名为 multi.part2.rar */
function resolve($vol) {
if (preg_match('/_broken/', $vol))
return str_replace('_broken', '', $vol);
else
return null;
}
$rar_file1 = rar_open(dirname(__FILE__).'/multi_broken.part1.rar', null, 'resolve');
$entry = $rar_file1->getEntry('file2.txt');
$entry->extract(null, dirname(__FILE__) . "/temp_file2.txt");
?>