PHP8 RarArchive::open
rar_open
(PECL rar >= 2.0.0)
RarArchive::open -- rar_open — 打开 RAR 存档
说明
面向对象风格 (method):
public static RarArchive::open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false
过程化风格:
rar_open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false
打开指定的 RAR 存档并返回表示它的 RarArchive 实例。
注意:如果打开多卷归档文件,则应将第一个卷的路径作为第一个参数传递。 否则,不会显示所有文件。这是设计使然。
参数
filename
Rar 存档的路径。
password
一个普通的密码,如果需要解密标头。默认情况下也会使用它 如果找到加密文件。请注意,这些文件可能具有 关于标头和标头之间的不同密码。
volume_callback
接收一个参数的函数 – 卷的路径 未找到 – 并返回具有正确路径的字符串 对于此类卷,如果此类卷为 null,则
为 null
不存在或未知。程序员应确保 传递的函数不会导致循环,因为此函数被调用 如果上一个调用中返回的路径未返回,则重复 对应于所需的体积。指定此参数将省略 每当卷 未找到;因此,仅返回null
的实现可用于省略此类通知。
警告
在版本 2.0.0 之前,此函数不会处理相对 正确的路径。使用 realpath() 作为解决方法。
返回值
Returns the requested RarArchive instance 或者在失败时返回 false.
更新日志
版本 | 说明 |
---|---|
PECL rar 3.0.0 | volume_callback 被添加。 |
示例
示例 #1 面向对象风格
<?php
$rar_arch = RarArchive::open('encrypted_headers.rar', 'samplepassword');
if ($rar_arch === FALSE)
die("Failed opening file");
$entries = $rar_arch->getEntries();
if ($entries === FALSE)
die("Failed fetching entries");
echo "Found " . count($entries) . " files.\n";
if (empty($entries))
die("No valid entries found.");
$stream = reset($entries)->getStream();
if ($stream === FALSE)
die("Failed opening first file");
$rar_arch->close();
echo "Content of first one follows:\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("Failed opening file");
$entries = rar_list($rar_arch);
if ($entries === FALSE)
die("Failed fetching entries");
echo "Found " . count($entries) . " files.\n";
if (empty($entries))
die("No valid entries found.");
$stream = reset($entries)->getStream();
if ($stream === FALSE)
die("Failed opening first file");
rar_close($rar_arch);
echo "Content of first one follows:\n";
echo stream_get_contents($stream);
fclose($stream);
?>
示例 #3 Volume Callback
<?php
/* In this example, there's a volume named multi_broken.part1.rar
* whose next volume is named 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");
?>