(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");
?>