Start · Sprachen · PHP · Referenz · RarEntry

RarEntry

Klasse

Repräsentiert einen einzelnen Eintrag (Datei oder Verzeichnis) innerhalb eines RAR-Archivs und bietet Methoden zum Lesen von Metadaten und Extrahieren von Inhalten.

seit PHP 2.0.0 Kategorie: io

Signatur

class RarEntry

Beschreibung

RarEntry ist eine Klasse der PECL-Erweiterung rar und wird nicht direkt instanziiert. Objekte dieses Typs erhält man stattdessen über RarArchive::getEntry() oder RarArchive::getEntries(). Jede Instanz repräsentiert genau einen Eintrag – also eine Datei oder ein Verzeichnis – innerhalb des geöffneten RAR-Archivs.

Die Klasse erlaubt den Zugriff auf sämtliche Metadaten eines Eintrags, wie Name, Größe (komprimiert/unkomprimiert), CRC-Prüfsumme, Zeitstempel, Kompressionsverfahren und Host-Betriebssystem. Damit eignet sie sich hervorragend zum Auflisten und Analysieren von Archivinhalten, ohne den gesamten Inhalt extrahieren zu müssen.

Darüber hinaus kann mit RarEntry::extract() der Inhalt eines Eintrags in ein Verzeichnis entpackt werden, oder mit RarEntry::getStream() ein PHP-Stream geöffnet werden, um den Inhalt direkt zu lesen – praktisch bei großen Dateien oder wenn kein Schreibzugriff auf das Dateisystem vorhanden ist.

Passwortgeschützte Einträge können ebenfalls verarbeitet werden, sofern das korrekte Passwort übergeben wird. Hinweis: Die rar-Erweiterung unterstützt ausschließlich das Lesen von RAR-Archiven; das Erstellen von RAR-Dateien ist nicht möglich.

Beispiele

Alle Einträge eines RAR-Archivs auflisten

<?php
$rar = RarArchive::open('beispiel.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 'Name:               ' . $entry->getName() . PHP_EOL;
    echo 'Unkomprimierte Größe: ' . $entry->getUnpackedSize() . ' Byte' . PHP_EOL;
    echo 'Komprimierte Größe:   ' . $entry->getPackedSize() . ' Byte' . PHP_EOL;
    echo 'CRC:                ' . dechex($entry->getCrc()) . PHP_EOL;
    echo 'Ist Verzeichnis:    ' . ($entry->isDirectory() ? 'Ja' : 'Nein') . PHP_EOL;
    echo str_repeat('-', 40) . PHP_EOL;
}

$rar->close();
Name: dokumente/readme.txt Unkomprimierte Größe: 1024 Byte Komprimierte Größe: 512 Byte CRC: a1b2c3d4 Ist Verzeichnis: Nein ----------------------------------------

Einzelnen Eintrag extrahieren und per Stream lesen

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

// Einzelnen Eintrag über Namen abrufen
$entry = $rar->getEntry('config/settings.ini');
if ($entry === false) {
    die('Eintrag nicht gefunden.');
}

// Inhalt über einen Stream auslesen (ohne Extraktion auf die Festplatte)
$stream = $entry->getStream();
if ($stream === false) {
    die('Stream konnte nicht geöffnet werden.');
}

$inhalt = stream_get_contents($stream);
fclose($stream);

echo 'Dateiinhalt:' . PHP_EOL . $inhalt . PHP_EOL;

// Alternativ: in ein Verzeichnis extrahieren
$entry->extract('/tmp/entpackt/');
echo 'Datei wurde nach /tmp/entpackt/ extrahiert.' . PHP_EOL;

$rar->close();
Dateiinhalt: [database] host=localhost name=meinedb Datei wurde nach /tmp/entpackt/ extrahiert.

Passwortgeschützten Eintrag extrahieren

<?php
$rar = RarArchive::open('geheim.rar', 'meinPasswort');
if ($rar === false) {
    die('Archiv konnte nicht geöffnet werden.');
}

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

if ($entry->isEncrypted()) {
    echo 'Eintrag ist verschlüsselt.' . PHP_EOL;
}

// Passwort beim Extrahieren angeben
$erfolg = $entry->extract('/tmp/', '', 'meinPasswort');
if ($erfolg) {
    echo 'Erfolgreich entschlüsselt und extrahiert.' . PHP_EOL;
} else {
    echo 'Fehler beim Entschlüsseln.' . PHP_EOL;
}

$rar->close();
Eintrag ist verschlüsselt. Erfolgreich entschlüsselt und extrahiert.

// Wichtig · Fallstricke

Wichtige Methoden im Überblick:

  • RarEntry::extract(string $dir, string $filepath = '', string $password = '', bool $extended_data = false): bool – Extrahiert den Eintrag in ein Verzeichnis.
  • RarEntry::getStream(string $password = ''): resource|false – Gibt einen PHP-Stream zum Lesen des unkomprimierten Inhalts zurück.
  • RarEntry::getName(): string – Gibt den Namen des Eintrags zurück.
  • RarEntry::getUnpackedSize(): int – Unkomprimierte Größe in Byte.
  • RarEntry::getPackedSize(): int – Komprimierte Größe in Byte.
  • RarEntry::getCrc(): int – CRC-Prüfsumme des Eintrags.
  • RarEntry::getFileTime(): string – Zeitstempel der Datei im Format Y-m-d H:i:s.
  • RarEntry::isDirectory(): bool – Gibt an, ob es sich um ein Verzeichnis handelt.
  • RarEntry::isEncrypted(): bool – Gibt an, ob der Eintrag verschlüsselt ist.
  • RarEntry::getHostOs(): int – Betriebssystem, unter dem der Eintrag erstellt wurde (Konstante, z. B. RarEntry::HOST_WIN32).
  • RarEntry::getMethod(): int – Verwendetes Kompressionsverfahren.

Sicherheitshinweis: Beim Extrahieren von Archiveninhalten in Verzeichnisse sollte stets der Zielpfad validiert werden, da Einträge mit relativen Pfaden wie ../../etc/passwd (sog. Path-Traversal-Angriffe) bei naiver Verarbeitung außerhalb des gewünschten Zielverzeichnisses landen könnten.

Verfügbarkeit: Die rar-Erweiterung ist nicht standardmäßig in PHP enthalten und muss über PECL installiert werden (pecl install rar). Sie unterstützt RAR3- und RAR5-Archive.