====== 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.
→ [[lyx_-_programmiersprache:units|Standard Library]] · [[lyx_-_programmiersprache:units:zip|std.zip]] · [[lyx_-_programmiersprache:units:tar|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