std.rar — RAR5-Archive lesen

std.rar liest RAR5-Archive (Signatur Rar!\x1A\x07\x01\x00). Es unterstützt ausschließlich unkomprimierte Einträge (method=0 / stored) — komprimierte Einträge werden beim Öffnen übersprungen, da der RAR-Kompressionsalgorithmus proprietär ist und keine offene Spezifikation existiert.

Standard Library · std.zip · std.tar

Kein Writer: Das Erstellen von RAR-Archiven erfordert eine RARLAB-Lizenz. std.rar ist daher ein reines Lese-Modul. Für eigene Archive ZIP oder TAR verwenden.

RAR4 nicht unterstützt: Nur RAR5. RAR4-Archive haben eine andere Signatur (Rar!\x1A\x07\x00) und werden von RarOpen abgelehnt.


Konstanten

Konstante Wert Bedeutung
RAR_MAX_ENTRIES 4096 Maximale stored-Einträge pro Archiv
RAR_ERR_OK 0 Kein Fehler
RAR_ERR_NOTRAR 1 Keine gültige RAR5-Datei
RAR_ERR_IO 2 I/O-Fehler
RAR_ERR_CORRUPT 3 Archiv beschädigt
RAR_ERR_COMPRESSED 4 Eintrag ist komprimiert (nicht lesbar)

Funktionen

Funktion Rückgabe Beschreibung
RarOpen(path) int64 Handle oder 0 Öffnet RAR5-Archiv; lädt alle stored-Einträge
RarClose(handle) void Gibt Handle und alle Ressourcen frei
RarCount(handle) int64 Anzahl der stored Einträge (komprimierte werden nicht gezählt)
RarName(handle, idx) int64 pchar Name des idx-ten Eintrags (interner Puffer — nicht free'n)
RarSize(handle, idx) int64 Größe in Bytes
RarRead(handle, idx, outBuf, maxLen) int64 Bytes oder -1 Liest stored Eintrag in outBuf
RarFind(handle, name) int64 Index oder -1 Sucht Eintrag nach exaktem Namen (UTF-8)

Verwendung

import std.rar;
import std.alloc;
import std.io;

fn RarInhaltLesen(pfad: pchar): void {
    var r: int64 := RarOpen(pfad as int64);
    if r == 0 then {
        PrintLn("Kein gültiges RAR5-Archiv"c);
        return;
    }

    var n: int64 := RarCount(r);
    Print("Stored-Einträge: "c); PrintLn(IntToStr(n)c);

    var i: int64 := 0;
    while i < n do {
        Print(RarName(r, i) as pchar);
        Print("  "c);
        PrintLn(IntToStr(RarSize(r, i))c);
        i := i + 1;
    }

    RarClose(r);
}

fn RarDateiExtrahieren(pfad: pchar, name: pchar): void {
    var r: int64 := RarOpen(pfad as int64);
    if r == 0 then { return; }

    var idx: int64 := RarFind(r, name as int64);
    if idx < 0 then {
        PrintLn("Datei nicht gefunden oder komprimiert"c);
        RarClose(r);
        return;
    }

    var sz: int64  := RarSize(r, idx);
    var buf: int64 := alloc(sz + 1);
    var written: int64 := RarRead(r, idx, buf, sz);
    if written >= 0 then {
        poke8(buf + written, 0);
        PrintLn(buf as pchar);
    }
    free(buf, sz + 1);

    RarClose(r);
}


Hinweise

Komprimierte Einträge: RarOpen überspringt alle Einträge mit method > 0 still und ohne Fehlermeldung. RarCount und RarFind sehen diese Einträge nicht. Wenn ein Archiv ausschließlich komprimierte Dateien enthält, gibt RarCount 0 zurück — kein Fehler, aber keine Daten.

Verzeichnisse: Einträge mit gesetztem FHD_DIRECTORY-Flag (Bit 0 in fileFlags) werden übersprungen.

RAR erstellen: Nicht möglich — ZIP oder TAR verwenden:

// Statt RAR → ZIP:
import std.zip;
var w: int64 := ZipWriterNew();
ZipWriterAdd(w, "datei.txt"c as int64, data, dataLen);
ZipWriterSave(w, "ausgabe.zip"c as int64);
ZipWriterFree(w);


Speicherverwaltung

Handle Freigabe
RarOpen → Reader-Handle RarClose(handle)
RarName → interner Puffer nicht free'n — gehört dem Handle
outBuf in RarRead Aufrufer allokiert, Aufrufer gibt frei

Letzte Aktualisierung: 2026-06-13