Start · Sprachen · PHP · Referenz · RarArchive

RarArchive

Klasse

Repräsentiert ein geöffnetes RAR-Archiv und ermöglicht den Zugriff auf dessen Einträge, Metadaten und Inhalte.

seit PHP 2.0.0 Kategorie: io

Signatur

class RarArchive

Beschreibung

RarArchive ist die zentrale Klasse der PECL-Erweiterung rar und kapselt ein geöffnetes RAR-Archiv. Über sie lassen sich Einträge (Dateien und Verzeichnisse) im Archiv auflisten, einzelne RarEntry-Objekte abrufen und der Kommentar des Archivs lesen. Die Klasse unterstützt sowohl einteilige als auch mehrteilige (Multi-Volume) RAR-Archive.

Ein Archiv wird mit der statischen Fabrikmethode RarArchive::open() geöffnet, die im Erfolgsfall ein RarArchive-Objekt zurückgibt. Nach der Arbeit mit dem Archiv sollte es explizit mit RarArchive::close() geschlossen werden, um Ressourcen freizugeben. Die Klasse implementiert zudem __toString(), sodass eine aussagekräftige Darstellung direkt ausgegeben werden kann.

Für den Zugriff auf einzelne Einträge stehen RarArchive::getEntry() (für einen Eintrag nach Name) und RarArchive::getEntries() (für alle Einträge als Array) zur Verfügung. Der eigentliche Inhalt wird dann über das zugehörige RarEntry-Objekt, etwa mit RarEntry::extract(), extrahiert.

Voraussetzung: Die PECL-Erweiterung rar muss installiert und in der php.ini aktiviert sein (extension=rar). Das Schreiben oder Erstellen von RAR-Archiven ist mit dieser Erweiterung nicht möglich — sie ist ausschließlich lesend.

Beispiele

Alle Einträge eines RAR-Archivs auflisten

<?php
$rar = RarArchive::open('/pfad/zum/archiv.rar');
if ($rar === false) {
    die('Archiv konnte nicht geöffnet werden.');
}

$entries = $rar->getEntries();
if ($entries === false) {
    die('Einträge konnten nicht gelesen werden.');
}

foreach ($entries as $entry) {
    echo $entry->getName()
        . ' (' . $entry->getPackedSize() . ' Bytes komprimiert)'
        . PHP_EOL;
}

$rar->close();
?>
dokument.pdf (4218 Bytes komprimiert) bilder/foto.jpg (91034 Bytes komprimiert)

Einzelnen Eintrag extrahieren

<?php
$rar = RarArchive::open('/pfad/zum/archiv.rar', 'geheimesPasswort');
if ($rar === false) {
    die('Archiv konnte nicht geöffnet werden.');
}

$entry = $rar->getEntry('dokument.pdf');
if ($entry === false) {
    $rar->close();
    die('Eintrag nicht gefunden.');
}

$zielVerzeichnis = '/tmp/extraktion/';
if ($entry->extract($zielVerzeichnis)) {
    echo 'Datei erfolgreich extrahiert nach: ' . $zielVerzeichnis . PHP_EOL;
} else {
    echo 'Extraktion fehlgeschlagen.' . PHP_EOL;
}

$rar->close();
?>
Datei erfolgreich extrahiert nach: /tmp/extraktion/

Archiv-Kommentar und __toString verwenden

<?php
$rar = RarArchive::open('/pfad/zum/archiv.rar');
if ($rar === false) {
    die('Öffnen fehlgeschlagen.');
}

$kommentar = $rar->getComment();
if ($kommentar !== null) {
    echo 'Archiv-Kommentar: ' . $kommentar . PHP_EOL;
}

// __toString-Ausgabe
echo $rar . PHP_EOL;

$rar->close();
?>
Archiv-Kommentar: Erstellt am 2024-01-15 RarArchive(archiv.rar)

// Wichtig · Fallstricke

Sicherheitshinweis: Beim Extrahieren von Archiveinhalten in Verzeichnisse ist auf sogenannte Path-Traversal-Angriffe zu achten: Einträge können theoretisch Pfade wie ../../etc/passwd im Namen tragen. Prüfe jeden Eintragsnamen mit realpath() oder basename(), bevor du ihn zum Extrahieren verwendest.

Passwörter: RAR-Archive können passwortgeschützt sein. Das Passwort wird als zweiter Parameter an RarArchive::open() übergeben. Falsche Passwörter werden nicht immer sofort, sondern erst beim Extrahieren eines Eintrags als Fehler sichtbar.

Multi-Volume-Archive: Bei mehrteiligen Archiven muss der Pfad zum ersten Teil (z. B. archiv.part1.rar) angegeben werden. Die Folgedateien werden automatisch gesucht und müssen sich im selben Verzeichnis befinden.

Die Klasse ist nicht instantiierbar über new RarArchive() — die Erzeugung erfolgt ausschließlich über RarArchive::open().