====== std.zip — ZIP-Archive lesen und schreiben ====== ''std.zip'' liest und schreibt ZIP-Archive nach PKWARE APPNOTE. Die Unit implementiert die Kompressionsmethoden stored (method 0) und deflated (method 8, via ''std.zlib'') und wählt beim Schreiben automatisch die günstigere Variante. Keine externen Abhängigkeiten außer ''std.zlib'' für die Kompression. → [[lyx_-_programmiersprache:units|Standard Library]] · [[lyx_-_programmiersprache:units:tar|std.tar]] · [[lyx_-_programmiersprache:units:rar|std.rar]] **Einschränkungen:** Max. 4096 Einträge pro Archiv. Keine ZIP64-Unterstützung — Einzeldateien sind auf ~2 GB begrenzt. Kein Passwortschutz. ---- ===== Konstanten ===== ^ Konstante ^ Wert ^ Bedeutung ^ | ''ZIP_MAX_ENTRIES'' | 4096 | Maximale Einträge pro Archiv | | ''ZIP_METHOD_STORE'' | 0 | Kompressionsmethode: unkomprimiert | | ''ZIP_METHOD_DEFLATE'' | 8 | Kompressionsmethode: DEFLATE | | ''ZIP_STORE_THRESHOLD'' | 64 | Dateien ≤ 64 Bytes werden immer stored | | ''ZIP_ERR_OK'' | 0 | Kein Fehler | | ''ZIP_ERR_NOTZIP'' | 1 | Keine gültige ZIP-Datei | | ''ZIP_ERR_IO'' | 2 | I/O-Fehler beim Lesen oder Schreiben | | ''ZIP_ERR_CORRUPT'' | 3 | Archiv beschädigt | | ''ZIP_ERR_FULL'' | 4 | ZIP_MAX_ENTRIES erreicht | ---- ===== Lesen (ZipReader) ===== ^ Funktion ^ Rückgabe ^ Beschreibung ^ | ''ZipOpen(path)'' | ''int64'' Handle oder 0 | Öffnet ZIP-Archiv aus Datei | | ''ZipClose(handle)'' | ''void'' | Gibt Handle und alle Ressourcen frei | | ''ZipCount(handle)'' | ''int64'' | Anzahl der Einträge | | ''ZipName(handle, idx)'' | ''int64'' pchar | Name des idx-ten Eintrags (interner Puffer — nicht free'n) | | ''ZipUncompSize(handle, idx)'' | ''int64'' | Unkomprimierte Größe in Bytes | | ''ZipRead(handle, idx, outBuf, maxLen)'' | ''int64'' Bytes oder -1 | Dekomprimiert Eintrag in outBuf | | ''ZipFind(handle, name)'' | ''int64'' Index oder -1 | Sucht Eintrag nach Namen | ''ZipRead'' dekomprimiert automatisch (stored oder deflated). ''outBuf'' muss mindestens ''ZipUncompSize'' Bytes groß sein. import std.zip; import std.alloc; import std.io; fn ZipInhaltLesen(pfad: pchar): void { var z: int64 := ZipOpen(pfad as int64); if z == 0 then { PrintLn("Kein gültiges ZIP"c); return; } var n: int64 := ZipCount(z); Print("Einträge: "c); PrintLn(IntToStr(n)c); var i: int64 := 0; while i < n do { Print(ZipName(z, i) as pchar); Print(" "c); PrintLn(IntToStr(ZipUncompSize(z, i))c); i := i + 1; } // Einzelne Datei lesen var idx: int64 := ZipFind(z, "config.json"c as int64); if idx >= 0 then { var sz: int64 := ZipUncompSize(z, idx); var buf: int64 := alloc(sz + 1); ZipRead(z, idx, buf, sz); poke8(buf + sz, 0); PrintLn(buf as pchar); free(buf, sz + 1); } ZipClose(z); } ---- ===== Schreiben (ZipWriter) ===== ^ Funktion ^ Rückgabe ^ Beschreibung ^ | ''ZipWriterNew()'' | ''int64'' Writer-Handle | Erstellt neuen leeren Writer | | ''ZipWriterAdd(writer, name, data, dataLen)'' | ''int64'' Fehlercode | Fügt Eintrag hinzu (kopiert Name + Daten) | | ''ZipWriterSave(writer, path)'' | ''int64'' Fehlercode | Schreibt Archiv in Datei | | ''ZipWriterFree(writer)'' | ''void'' | Gibt Writer und alle Einträge frei | Methode wird automatisch gewählt: stored für ≤ 64 Bytes und wenn deflate keine Verbesserung bringt, sonst deflated. import std.zip; import std.alloc; fn ZipErstellen(): void { var w: int64 := ZipWriterNew(); var inhalt: pchar := "Hallo aus Lyx!"c; ZipWriterAdd(w, "hallo.txt"c as int64, inhalt as int64, 14); var json: pchar := "{\"version\": 1}"c; ZipWriterAdd(w, "meta/config.json"c as int64, json as int64, 14); var rc: int64 := ZipWriterSave(w, "ausgabe.zip"c as int64); if rc != ZIP_ERR_OK then { PrintLn("Fehler beim Speichern"c); } ZipWriterFree(w); } ---- ===== Speicherverwaltung ===== ^ Handle ^ Freigabe ^ | ''ZipOpen'' → Reader-Handle | ''ZipClose(handle)'' | | ''ZipWriterNew'' → Writer-Handle | ''ZipWriterFree(writer)'' | | ''ZipName'' → interner Puffer | **nicht free'n** — gehört dem Handle | | ''outBuf'' in ''ZipRead'' | Aufrufer allokiert, Aufrufer gibt frei | Letzte Aktualisierung: 2026-06-13