====== 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