PHP Conference Nagoya 2025

rar://

rar://RAR

Description

Cette enveloppe prend le chemin encodé URL vers l'archive RAR (relatif ou absolu), puis, optionnellement, un astérisque (*), optionnellement suivi d'un signe dièse (#), et, toujours optionnellement, un nom d'entrée encodé URL, tel que stocké dans l'archive. Le fait de spécifier un nom d'entrée nécessite la présence du signe dièse ; la présence d'un slash au début du nom de l'entrée est optionnelle.

Cette enveloppe peut ouvrir à la fois des fichiers et des dossiers. Lors de l'ouverture de dossiers, l'astérisque force les noms des dossiers à être retournés non encodés. S'il n'est pas spécifié, ils seront retournés sous la forme encodée URL - ceci permet à l'enveloppe d'être utilisé correctement avec les fonctionnalités internes comme RecursiveDirectoryIterator en présence de noms de fichiers qui semblent être encodés URL.

Si le signe dièse et le nom de l'entrée ne sont pas inclus, la racine de l'archive sera affichée. Cet affichage est différent des dossiers réguliers dans le sens où le flux résultant ne contiendra pas d'information comme la date et heure de modification, puisque la racine du dossier n'est pas stockée comme une entrée individuelle dans l'archive. L'utilisation de cette enveloppe avec RecursiveDirectoryIterator nécessite la présence du signe dièse dans l'URL lors de l'accès à la racine, afin de construire correctement les URLs des fils.

Note: Cette enveloppe n'est pas activé par défaut
Pour utiliser l'enveloppe rar://, l'extension » rar disponible sur » PECL doit être installée.

rar:// est disponible depuis PECL rar 3.0.0

Utilisation

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

Options

Résumé de l'enveloppe
Attribut Supporté
Restreint par allow_url_fopen Non
Restreint par allow_url_include Non
Autorise la lecture Oui
Autorise l'écriture Non
Autorise l'ajout Non
Autorise la lecture et l'écriture simultanément Non
Support de la fonction stat() Oui
Support de la fonction unlink() Non
Support de la fonction rename() Non
Support de la fonction mkdir() Non
Support de la fonction rmdir() Non

Options de contexte
Nom Utilisation Défaut
open_password Le mot de passe utilisé pour crypter les en-têtes de l'archive, s'il y en a. WinRAR cryptera tous les fichiers avec le même mot de passe que les en-têtes lorsque celui-ci est présent, donc, pour les archives avec des en-têtes encryptés, file_password sera ignoré.  
file_password Le mot de passe utilisé pour crypter un fichier, s'il y en a. Si les en-têtes sont aussi cryptés, cette option sera ignorée et le mot de passe de l'option open_password sera privilégié. La raison pour laquelle il y a 2 options est le souhait de pouvoir couvrir la possibilité de supporter les archives avec différents mots de passe pour les en-têtes et les fichiers. Notez que si l'en-tête de l'archive n'est pas crypté, l'option open_password sera ignorée et cette option doit être utilisée à la place.  
volume_callback Une fonction de rappel pour déterminer le chemin des volumes manquants. Reportez-vous à la méthode RarArchive::open() pour plus d'informations.  

Exemples

Exemple #1 Parcours d'une archive 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";
}
?>

Résultat de l'exemple ci-dessus est similaire à :

|-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

Exemple #2 Ouverture d'un fichier crypté (en-tête crypté)

<?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));
/* Les dates de création et de dernier accès sont optionnelles avec WinRAR,
* ce qui explique que la plupart des fichiers ne les aient pas */
var_dump(fstat($stream));
?>

Résultat de l'exemple ci-dessus est similaire à :

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
)
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top