PHP Conference Japan 2024

RarArchive::open

rar_open

(PECL rar >= 2.0.0)

RarArchive::open -- rar_open打开RAR压缩包

描述

面向对象风格(方法)

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的实现可用于简单地忽略此类通知。

警告

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

添加注释

用户贡献的注释

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