rar:// — RAR
Esta envoltura toma la ruta codificada URL hacia el archivo RAR (relativo o absoluto),
luego, opcionalmente, un asterisco (*
), opcionalmente seguido
de un signo de número (#
), y, siempre opcionalmente, un nombre de entrada
codificado URL, tal como se almacena en el archivo. La especificación de un nombre de entrada
requiere la presencia del signo de número; la presencia de una barra al inicio del nombre de
la entrada es opcional.
Esta envoltura puede abrir tanto ficheros como directorios. Al abrir directorios, el asterisco fuerza a que los nombres de los directorios sean devueltos sin codificar. Si no se especifica, serán devueltos en forma codificada URL - esto permite que la envoltura sea utilizada correctamente con funcionalidades internas como RecursiveDirectoryIterator en presencia de nombres de ficheros que parecen estar codificados URL.
Si el signo de número y el nombre de la entrada no están incluidos, se mostrará la raíz del archivo. Esta visualización es diferente de los directorios regulares en el sentido de que el flujo resultante no contendrá información como la fecha y hora de modificación, ya que la raíz del directorio no se almacena como una entrada individual en el archivo. El uso de esta envoltura con RecursiveDirectoryIterator requiere la presencia del signo de número en la URL al acceder a la raíz, para construir correctamente las URLs de los hijos.
Nota: Esta envoltura no está activada por defecto
Para utilizar la envoltura rar://, la extensión » rar disponible en » PECL debe estar instalada.
rar:// está disponible a partir de PECL rar 3.0.0
Ejemplo #1 Recorrido de 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 Apertura de un fichero cifrado (encabezado cifrado)
<?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));
/* Las fechas de creación y último acceso son opcionales con WinRAR,
* lo que explica que la mayoría de los ficheros no las tengan */
var_dump(fstat($stream));
?>
El resultado del ejemplo sería algo similar a:
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 )