rar:// — RAR
Esta envoltura se compone de una ruta al fichero RAR (relativa o absoluta) codificada como URL, un asterisco opcional (*), un signo de número opcional (#) y un nombre de entrada codificado como URL que también es opcional, tal como se almacena en el fichero. Cuando se especifique un nombre de entrada, será necesario también especificar un signo de número; además, se puede añadir al final del nombre una barra.
Esta envoltura puede abrir tanto ficheros como directorios. Cuando se abre un directorio, el signo asterisco obliga a que los nombres de las entradas del directorio se devuelvan decodificados. Si no se especifica, se devolverán codificadas como URL – esto es así para permitir hacer un uso correcto de la envoltura con determinadas funcionalidades, como RecursiveDirectoryIterator cuando se está en presencia de nombres de ficheros que podrían parecen datos codificados como URL.
Si no se proporciona ni un signo de número ni tampoco un número de entrada, se mostrará la raíz del fichero. La diferencia respecto a directorios convencionales es que el flujo no contendrá determinada información, tal como la fecha de modificación, dado que el directorio raíz no se almacena dentro el fichero comprimido en de una entrada individual. Para usar la envoltura con RecursiveDirectoryIterator es necesario que al acceder al raíz se incluya el signo de número en la URL, para que así las URLs de los nodos hijo se puedan construir correctamente.
Nota: Esta envoltura no está habilitada por omisión
Para poder usar la envoltura rar://, debe instalarse la extensión » rar disponible en » PECL.
rar:// Disponible desde PECL rar 3.0.0
Ejemplo #1 Recorriendo un archivo 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";
}
?>
El resultado del ejemplo sería algo similar a:
|-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
Ejemplo #2 Abriendo un fichero encriptado (encriptación de cabeceras)
<?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));
/* ni la fecha de creación ni la de último acceso es obligatoria WinRAR,
* por esa razón la mayoría de ficheros no lo tendrán */
var_dump(fstat($stream));
?>
El resultado del ejemplo sería algo similar a:
string(34) "Contenido del fichero encriptado 1" 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 )