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.
| 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) |
| 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) |
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);
}
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);
| 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