rar://

rar://RAR

Описание

Эта обертка принимает URL-кодированный путь к RAR-архиву (относительный или абсолютный), необязательный символ звездочки (*), необязательный символ решетки (#) и необязательное URL-кодированное имя такое, как хранится в архиве. Для указания имени содержимого требуется символ решетки, начальный обратный слеш в названии содержимого необязателен.

Эта обертка может открывать файлы и директории. Когда открываются директории, знак звездочки требует, чтобы имена объектов директории были закодированы unencode. Если такой знак не указан, они будут возвращены в URL-кодировке. Смысл этого в том, чтобы позволить обертке корректно использовать встроенную функциональность, такую как RecursiveDirectoryIterator когда присутствуют имена файлов, которые кажутся как url-закодированные данные.

Если символ решетки и часть имени записи не включена, будет отображен корень архива. Это отличается от обычных директорий тем, что результирующий поток не будет содержать такую информацию, как время модификации, так как корневая директория не сохраняется как отдельная запись в архиве. Использование обертки с RecursiveDirectoryIterator требует, чтобы символ решетки был включен в URL, когда происходит доступ к корню, так чтобы URL потомков мог быть сконструирован правильно.

Замечание: Эта обертка не включена по умолчанию
Для того, чтобы использовать обертку rar://, вам необходимо установить расширение » rar, доступное из репозитория » PECL.

rar:// Доступно начиная с PECL rar 3.0.0

Использование

  • rar://<url encoded archive name>[*][#[<url encoded entry name>]]

Опции

Основная информация
Атрибут Поддержка
Ограничение по allow_url_fopen Нет
Ограничение по allow_url_include Нет
Чтение Да
Запись Нет
Добавление Нет
Одновременное чтение и запись Нет
Поддержка stat() Да
Поддержка unlink() Нет
Поддержка rename() Нет
Поддержка mkdir() Нет
Поддержка rmdir() Нет

Опции контекста
Название Использование По умолчанию
open_password Пароль используется для шифрования заголовков архива, если таковые есть. WinRAR будет шифровать все файлы с таким же паролем, как и пароль заголовков, когда последний присутствует. Поэтому для архивов с зашифрованными заголовками опция file_password будет проигнорирована.  
file_password Пароль, используемый для шифрования файла, если таковой имеется. Если заголовки также зашифрованы, эта опция будет игнорирована в пользу open_password. Причина этого в том, что нет смысла в использовании одновременно двух разных паролей для шифрования отдельно заголовков и отдельно файлов. Нет таких архивов, где бы это пригодилось. Заметим, что если у архива отсутствуют зашифрованные заголовки, то опция open_password будет игнорирована и эта опция должна быть использована вместо нее.  
volume_callback Обратный вызов для определения пути недостающих томов архива. Смотрите RarArchive::open() для более детальной информации.  

Примеры

Пример #1 Обход RAR-архива

<?php

class MyRecDirIt extends RecursiveDirectoryIterator {
    function 
current() {
        return 
rawurldecode($this->getSubPathName()) .
            (
is_dir(parent::current())?" [DIR]":"");
    }
}

$f "rar://" rawurlencode(dirname(__FILE__)) .
    
DIRECTORY_SEPARATOR 'dirs_and_extra_headers.rar#';

$it = new RecursiveTreeIterator(new MyRecDirIt($f));

foreach (
$it as $s) {
    echo 
$s"\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

|-allow_everyone_ni [DIR]
|-file1.txt
|-file2_אּ.txt
|-with_streams.txt
\-אּ [DIR]
  |-אּ\%2Fempty%2E [DIR]
  | \-אּ\%2Fempty%2E\file7.txt
  |-אּ\empty [DIR]
  |-אּ\file3.txt
  |-אּ\file4_אּ.txt
  \-אּ\אּ_2 [DIR]
    |-אּ\אּ_2\file5.txt
    \-אּ\אּ_2\file6_אּ.txt

Пример #2 Открытие зашифрованного файла (шифрование заголовка)

<?php
$stream 
fopen("rar://" .
    
rawurlencode(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
    
'encrypted_headers.rar' '#encfile1.txt'"r"false,
    
stream_context_create(
        array(
            
'rar' =>
                array(
                    
'open_password' => 'samplepassword'
                
)
            )
        )
    );
var_dump(stream_get_contents($stream));
/* дата создания и дата последнего доступа включается опционально в WinRAR, поэтому у
 * большинства файлов их нет */
var_dump(fstat($stream));
?>

Результатом выполнения данного примера будет что-то подобное:

string(26) "Encrypted file 1 contents."
Array
(
    [0] => 0
    [1] => 0
    [2] => 33206
    [3] => 1
    [4] => 0
    [5] => 0
    [6] => 0
    [7] => 26
    [8] => 0
    [9] => 1259550052
    [10] => 0
    [11] => -1
    [12] => -1
    [dev] => 0
    [ino] => 0
    [mode] => 33206
    [nlink] => 1
    [uid] => 0
    [gid] => 0
    [rdev] => 0
    [size] => 26
    [atime] => 0
    [mtime] => 1259550052
    [ctime] => 0
    [blksize] => -1
    [blocks] => -1
)