I'm just confused why Rar::open() would be static, there should be a constructor instead.
I think $rar = new RarArchive(...); is much better than $rar = RarArchive::open(...); that is the real OOP style.
(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);
?>
Вывод приведённого примера будет похож на:
Найдено 2 файлов. Содержимое первого файла: 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("Failed fetching entries");
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 Callback-функция для тома
<?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");
?>
I'm just confused why Rar::open() would be static, there should be a constructor instead.
I think $rar = new RarArchive(...); is much better than $rar = RarArchive::open(...); that is the real OOP style.