Version history for ZArchiveSharp and the zar CLI. Package versions derive
from v-prefixed git tags via MinVer; since v1.2.2 every project in the
solution (library, CLI, tests, benchmarks) releases together. The detailed
notes for the current release live in
WhatsNew.md.
License change (after v1.2.0): ZArchiveSharp is now distributed under the ZArchiveSharp Non-Commercial License because its pipeline layer is a port of ZarManager 1.2.0, whose license permits non-commercial use only. The v1.2.0 NuGet packages were published under MIT; later releases use the non-commercial license. Third-party notices: THIRD-PARTY-NOTICES.md.
Highlights
- Mount-friendly reader API. Node-handle directory walks
(
RootNode,TryGetDirEntry), canonical names (TryGetNodeName), seekable per-entry streams (OpenRead/TryOpenRead), and archive stats (EntryCount,TotalUncompressedSize) for virtual file systems and other random-access hosts. - Specific open-failure reasons.
ZArchiveOpenFailureplusoutoverloads for path/stream/byte-array opens reportBadMagic,UnsupportedVersion,LengthMismatch,SectionOutOfRange,BadOffsetRecords,BadNameTable,BadFileTree,TooSmall,InvalidStream,FileNotFound,AccessDenied,ReadErrorandInvalidPathinstead of a barenull. - Reader options.
ZArchiveReaderOptionsaddsCacheBlockCount(default 64 × 64 KiB), opt-in corrected extended-name decoding (DecodeExtendedNames), andFileSharefor path opens. - Parallel block decode.
ReadFromFiledecompresses distinct 64 KiB blocks outside the global lock (cache bookkeeping and copies stay locked), so concurrent reads scale; the preallocated LRU buffers are preserved. - Hardening fixes. Extraction still rejects crafted directory child
ranges loudly; null/empty/invalid paths report
InvalidPath;TotalUncompressedSizesaturates instead of wrapping.
Upgrade notes
- Additive API: no wire-format or CLI behavior changes, no breaking changes to existing reader overloads.
- Behavior changes apply only to invalid or crafted input:
InvalidPathfor bad paths, clamped enumeration counts, loud extraction failure on crafted child ranges, and a saturating archive size.
Highlights
- CLI help names the executable you launched. Usage, help, error text and
--versionprintZArchiveSharpfrom the standalone bundles andzarfrom the global tool (falling back tozarfordotnet ZArchiveSharp.Cli.dll). The substitution is token-aware, so the.zarextension andzstdare unaffected. - Windows app icon and metadata. The CLI executable now embeds the
ZArchiveSharp icon (
ApplicationIcon) andCompany = PureLogicCode.com; Unix bundles are unaffected. - Tag-driven versioning for every project. MinVer moved to
Directory.Build.props, so the library, CLI, tests, battle tests and benchmarks all stamp1.2.2. - Standalone release bundles for win/linux/osx × x64/arm64
(
release_1.2.2_<rid>.zip): single-file, framework-dependent (no .NET runtime embedded; .NET 10 runtime required), with theZArchiveSharp.Cli.runtimeconfig.jsonsidecar, README, LICENSE and THIRD-PARTY-NOTICES, and executable bits set on Unix.
Upgrade notes
- No wire-format or API changes since v1.2.0.
- Standalone bundles are framework-dependent: install the matching .NET runtime and keep the runtimeconfig sidecar next to the executable.
Highlights
- License change. ZArchiveSharp became a derivative of ZarManager 1.2.0 (non-commercial license), so releases since v1.2.1 are distributed under the ZArchiveSharp Non-Commercial License: commercial use, selling, and use in commercial products are prohibited without prior written consent.
- Added THIRD-PARTY-NOTICES.md with the ZarManager license text plus the permissive notices (ZArchive MIT-0, libzstd BSD-3, zeekstd BSD-2, seekable-zstd MIT, ZstdSharp MIT), and the XGDTool (GPL-3.0, not incorporated) note.
- NuGet packages now ship
<license type="file">LICENSE</license>and include the notices file; release notes call out the change.
Upgrade notes
- The v1.2.0 packages remain MIT; v1.2.1 and later are non-commercial. No binary or API changes.
Highlights
- CLI telemetry, logging, and update checks (opt-out). Serilog-backed
logging, bug-report forwarding, anonymous usage stats, and a background
GitHub release check. Disable everything with
--no-telemetryorZAR_BUG_REPORT=off;--help/--versionnever send. Telemetry flush is bounded (<1 s) and never delays exit. - Extraction security. Zip-slip validation (traversal, absolute, drive-qualified, and Windows device names), resolved-path re-validation, a 1024-level nesting cap, scratch-file writes moved into place after the size check, and no descending through directory symlinks/junctions.
- Argument handling. Unknown options are
-1;--ends option parsing everywhere (including insidezar zstd/zar seekable); value options no longer swallow the next flag while dashed values remain usable;-cbefore or afterzstdmeans compress. Batch runs report-11when the only failures are collision refusals and-13for missing 7z/unreadable batch input. - Correctness. CP1252 name identity/order matches the C++ tool; splitter
repeat history matches native; frame headers survive staging-buffer
compaction; skippable payloads are streamed, not buffered;
SeekableReaderrange errors are clean-12failures (not crashes); process-runner stderr/kill handling hardened; delete-source runs only after the terminal.zarsucceeds. - New APIs.
ZstdDecoderOptions.MaxTotalOutputSize(1 GiB default),ZarPackEngine.MoveIntoPlace,ZarPackEngine.OutputExistsMessage,ZarPackEngine.MaxExtractDepth;ZarPackEngine.PackEntriesreturns the written path and takes a collision policy;PauseTokenSourceisIDisposable.
Upgrade notes
- Level-6 output stays byte-identical, and CP1252-representable archive names are unchanged; names with unrepresentable characters now collapse like the C++ tool.
SeekableReader.DecompressRange/DecompressFramesnow throwArgumentOutOfRangeExceptionfor range errors (wasZstdException).ZArchiveReader.TryOpen(Stream)disposes the stream when the open fails (withleaveOpen: false, the default).- Telemetry is opt-out; no data is sent for
--help/--versionlaunches.
Full notes: WhatsNew.md.
Highlights
- Block-level parallelism for a single pack/extract:
ZarPipelineOptions.MaxDegreeOfParallelismfans 64 KiB block compression/decompression across workers, byte-identical to sequential output. DirectZArchiveWriteruse stays sequential unless acompressorFactoryis supplied. - Codec scratch pooling (match tables, frame copies, sequence stores) reduces GC pressure on large packs.
- CLI positional contract matches the oracle: exactly
input [output];-ooccupies the output slot;--isotakes the output positionally or via-o, never both; extras fail with-1/Too many paths specified. - CLI battle-test suite (
ZArchiveSharp.CliBattleTests) locks exit codes, stdout, and cross-interop against the referencezarchive.exewhen it is present. - Packaging: XISOSharp via NuGet (
1.0.2), single-file bundle namedZArchiveSharp.exe.
Pre-release-notes versions established the ZArchive 0.1.2 container port,
the full RFC 8878 zstd codec (levels 1–22, all 9 strategies), the seekable
zstd format, the pipeline engine, and the initial zar CLI. See the git tags
(v1.0.0, v1.0.1, v1.0.2) for the corresponding sources.