rar:// — RAR
Der Wrapper akzeptiert den URL-kodierten Pfad zum RAR-Archiv (relativ oder
absolut), ein optionales Sternchen (*
), ein optionales
Nummernzeichen (#
) und optional den URL-kodierten Namen
des Eintrags, wie er im Archiv gespeichert ist. Bei Angabe eines
Eintragsnamens muss das Nummernzeichen angegeben werden; ein führender
Schrägstrich im Eintragsnamen ist optional.
Mit diesem Wrapper können sowohl Dateien als auch Verzeichnisse geöffnet werden. Beim Öffnen eines Verzeichnisses erzwingt das Sternchen, dass der Name des Verzeichniseintrags unkodiert zurückgegeben wird. Wenn es nicht angegeben ist, wird er URL-kodiert zurückgegeben. Damit soll sichergestellt werden, dass der Wrapper korrekt mit eingebauten Funktionen wie dem RecursiveDirectoryIterator verwendet werden kann, wenn der Dateiname nach URL-kodierten Daten aussieht.
Wenn der Teil mit dem Nummernsymbol und dem Eintragsnamen nicht angegeben wird, wird das Stammverzeichnis des Archivs angezeigt. Der Unterschied zu normalen Verzeichnissen besteht darin, dass der resultierende Stream keine Informationen wie z. B. die Änderungszeit enthält, weil das Stammverzeichnis nicht in als separater Eintrag im Archivs gespeichert ist. Wenn der Wrapper mit RecursiveDirectoryIterator verwendet werden soll, muss die URL das Nummernsymbol enthalten, damit die URLs der Unterverzeichnisse korrekt erstellt werden können.
Hinweis: Dieser Wrapper ist standardmäßig nicht aktiviert
Um den Wrapper rar:// verwenden zu können, muss die » rar-Erweiterung von » PECL installiert werden
rar:// Available since PECL rar 3.0.0
Beispiel #1 Durchlaufen eines RAR-Archivs
<?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";
}
?>
Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:
|-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
Beispiel #2 Öffnen einer verschlüsselten Datei (Header-Verschlüsselung)
<?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));
/* Erstellungsdatum und Datum des letzten Zugriffs sind in WinRAR optional,
* weshalb diese Angaben bei den meisten Dateien fehlen */
var_dump(fstat($stream));
?>
Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:
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 )