- AES-256 encrypted ZIP detection: 7-Zip-created encrypted ZIPs now correctly
detected via CompressionMethod::AES + PasswordRequired error (the zip crate's
encrypted()flag misses AES-256). Password prompt appears for these archives. - Encrypted ZIP extraction: pre-scan loop now uses password when summing file sizes (was hitting encrypted entries first and erroring before extraction started).
- Progress watchdog: corrupt archives that cause the decoder to stall now show "Archive appears corrupt" after 15s instead of hanging forever.
- RAR4 support: confirmed working (tested with real RAR4 archive from unrar.rs test data).
- Compiler warnings: reduced from 27 to 15 via cargo fix.
- Integrity checksum:
.zgxarchives now include zstd XXHash64 checksum verification on extract. Detects storage corruption, bad transfers, and bit rot before you lose data. Zero measurable speed cost (~6ms per 256MB — within run-to-run noise). - RAR extraction rewritten in pure Rust: replaces the vendored C unrar library with
unrar-rs(pure Rust, no C dependencies). Adds:- Symbolic link preservation (asks admin once, recreates links exactly)
- mtime + ctime restore on extracted files
- Windows attributes restore (ReadOnly, Hidden, etc.)
- Instant mid-file cancel (custom Writer aborts on cancel flag)
- Multi-volume support (part1.rar, part2.rar, ...)
- 7z metadata restore: extracted 7z files now preserve mtime, ctime (when carried), and Windows attributes.
- 7z symlink support: symlinks stored as reparse points in .7z archives are now detected and recreated (with path-traversal guard for security).
- Instant feedback on click: the progress window now shows an animated sweep the moment you click Compress or Extract — no more frozen 0% bar while the engine spins up.
- Encrypted archive support: password-protected RAR, 7z, and ZIP archives now
prompt for a password. GUI shows a masked password dialog with auto-focus.
CLI:
-p <password>flag works in any position. Example:lrgex-compress -x -p secret archive.rar
- 7z overwrite+cancel data loss (critical): extracting a .7z over an existing file, then cancelling, no longer destroys the user's original file. All 7z extraction now uses temp-then-rename (same safe pattern as .zgx and .zip).
- ctime clobber on every extract (critical): every extracted file was getting
creation time set to January 1, 1970. The bug was in
apply_times_handle—secs_to_filetime(0)is NOT a zero FILETIME (it's 1601+epoch_offset = 1970-01-01). The "NULL if zero" guard never fired. Fixed: branch on the INPUT value, not the converted FILETIME. - 7z mtime lost: 7z extraction was giving every file NOW() as last-modified time.
Now reads
entry.last_modified_date()from sevenz-rust2 and restores it. - Checksum failure silently swallowed:
include_checksum(true)was discarding the Result withlet _ =. Now propagates via.expect()— a checksum failure surfaces as an error instead of silently shipping without integrity. - Test harness pipe deadlock: integration tests could hang when the spawned exe
produced >64KB of stdout (pipe buffer fill). Fixed with
Stdio::null().
- 49 automated tests covering every format, every metadata field, cancel,
multi-volume, crash-safety, and overwrite+cancel data-loss scenarios.
- No
#[ignore]d tests hiding gaps — every test runs automatically. - RAR + 7z tests auto-detect external tools (WinRAR / 7-Zip) and run when present.
- No
- Vendored C unrar crate removed (210KB of C source). RAR extraction is 100% pure Rust.
- License: switched from MIT to GPL-3.0-or-later (unrar-rs is GPL-3.0 + UnRAR restriction).
- 7z symlinks: requires Administrator or Developer Mode to create symlinks on Windows. Without elevation, symlinks in .7z archives are skipped silently.
- zip ctime: the ZIP format has no creation time field — cannot be preserved.
- 7z ctime: 7-Zip does not store creation time by default (only with
-mtc=on). Restored when present, absent when not. - RAR4: unrar-rs claims support but could not be tested (WinRAR 7.23 creates RAR5 only).
- Encrypted archives: password-protected RAR, 7z, and ZIP are supported via GUI
prompt or
-p <password>CLI flag. However, the GUI window stays open briefly after extraction completes (auto-close delay). Scripted/headless use with-pblocks until the window is closed manually.
- 7z extraction:
.7zarchives now supported (LZMA2, pure Rust)- Single-volume
.7z— instant extraction with progress - Multi-volume
.7z.001/.002/...— right-click.001or.7zto extract - Per-chunk cancel (stops mid-file, not just between files)
- Overwrite confirmation (header-only read, no decompression needed)
- Path-traversal guard (zip-slip protection)
- Right-click
.7zand.001→ LRGEX → Extract
- Single-volume
- Instant RAR cancel: Cancel now stops RAR extraction mid-file (within 100ms) via UCM_PROCESSDATA callback abort — no more waiting for the current file to finish
- Clean archive names:
video.mp4→video.zgx(extension stripped)- Folders unchanged (
myfolder→myfolder.zgx) - Dotfiles preserved (
.git→.git.zgx)
- Folders unchanged (
- Extract Cancel: Cancel button now works during extraction (all formats)
- .zgx/.zip: cancel mid-file (byte-level)
- .rar: cancel between files (C library limitation)
- Split: cancel during SHA256 verification
- All formats: shows "Cancelled" (amber) + exits cleanly
- Split Compress: multi-volume .zgx archives
- Right-click → LRGEX → Split Compress
- Per-part SHA256 trailers for integrity
- Missing parts detected upfront with clear message
- Auto-update elevation: detects admin/UAC-disabled correctly (is_process_elevated)
- Update throttle: once per day (prevents 20s hangs on every launch)
- Declined update: 30-day expiry (re-asks after 30 days)
- GUI failure state: shows actual error message + Close button
- Exit code: non-zero on failure/cancel
- Progress bar stops animating on Failed
- Version badge moved to top-right (no overlap with buttons)
- Window fixed size (cannot resize)
- Friendly error messages for update failures
- /SILENT shows progress during update
- Auto-update now works for Program Files installs with UAC disabled (detects elevation, launches directly instead of failing on "runas")
- Double-click exe shows help instead of silent exit
- PATH changes broadcast immediately (no reboot needed)
- Friendly error messages for update failures
- Removed unnecessary "Signature verified" dialog
- Installer shows progress during update (/SILENT instead of /VERYSILENT)
- WM_SETTINGCHANGE broadcast for PATH
- Choco validExitCodes includes 3010
- Fixed stale doc comments in update.rs
- Split Compress: right-click any folder → LRGEX → Split Compress
- Choose segment size in MB (quick picks: 50, 100, 700, 4G)
- Produces
MyFolder.part001.zgx,.part002.zgx, etc. - Each part has a SHA256 trailer for integrity verification
- Extract ANY part → auto-detects and extracts the full archive
- Corrupt part → clear error naming which part to redownload
- CLI:
--split [--size <MB>] <folder>
- Auto-update fix: write-lock released before launching installer
- Truncation check now allows 64KB slack for zstd/tar trailing buffers
- Part discovery uses globbing (survives user renaming of parts)
- Contiguity check: missing middle part detected before extraction
- MAX_PARTS lowered to 1000 (bounds resource usage)
- Overwrite confirmation prompts added for both compression and extraction
- Partial files cleaned up if extraction fails or is cancelled
- Symlink targets inside archives validated before extraction
- Auto-update now works for all install types
- Read-only files no longer block overwrite
- Extraction continues past locked files
- Multi-volume RAR crash fixed (unrar callback)
- Crash handler added (VEH writes backtrace to crash-log.txt)
--helpflag added- "Don't ask again" for declined updates (per-version skip)
- Temp files use unique names to prevent collisions between same-name files
- Archive bit and other Windows attributes preserved exactly on round-trip
- Software renderer only (removes femtovg/OpenGL) — fixes no-UI on VMs without GPU
- Uninstall icon + installer version info (cosmetic)
- Installer now uses
{autopf}+HKA(Inno Setup dual-mode). Installs per-user (no admin) OR machine-wide (admin/choco) from the SAME binary. - Chocolatey passes
/ALLUSERSfor machine-wide install to%ProgramFiles%. - Portable download runs per-user to
%LOCALAPPDATA%as before. - All registry keys use
HKA→ HKLM when admin, HKCU when per-user. - Added
chocolateyuninstall.ps1that calls the Inno uninstaller. - Added
softwareNameto chocolateyinstall.ps1 for upgrade/uninstall detection.
LRGEX Compress now preserves your files exactly across a compress → extract round-trip. Whatever goes into the archive comes out identical — no more "every extracted file shows today's date."
- LastWriteTime (mtime) preserved on every file and folder — sort-by-date, build systems, sync tools, and incremental backups all keep working correctly.
- CreationTime (ctime) preserved — the original creation date is restored, not lost.
- Windows attributes preserved — Hidden, Read-only, System, and Archive flags survive the round-trip. A hidden file extracts hidden; a read-only file extracts read-only.
- Symbolic links / junctions preserved — links recreate as links. On Windows, creating a link needs Administrator or Developer Mode; LRGEX asks once ("allow admin?") and, if yes, re-launches the extraction elevated to recreate every link exactly. If you decline, links degrade gracefully (never aborts the whole extraction).
- Directory timestamps restored in a final pass — so writing children into a folder doesn't overwrite the folder's original mtime.
NTFS alternate data streams are not supported (rarely used; not planned).
- Metadata sidecar (
.lrgex/meta.bin): one small packed blob at the front of the archive replaces 11k+ per-entry metadata headers on big folders. Both compress and extract handle roughly half as many tar entries now. Old v1.4.0 archives still read correctly via the per-entry fallback. - One-syscall metadata restore (
SetFileInformationByHandle): mtime + ctime + attributes set in a single call on the already-open file handle — no per-file re-open. - Direct 4 MB chunked writes on large-file extract (no redundant
BufWritercopy). - Cache-served metadata on compress walk (
DirEntry::metadata()instead of a freshCreateFileper file) — saves thousands of syscalls on big folders. - Removed the redundant 4 MB
BufWriteron compress output — zstd already emits good-sized blocks; the buffer was a pure memcpy of every compressed byte. - Tuned zstd multithreading —
JobSize(16MB)+OverlapSizeLog(0)at level 1, fewer thread handoffs. - Dedicated oversubscribed write pool (3× core count) for extraction writes —
correct sizing for workers that block in
CreateFileand Defender scans.
- Multi-select coordinator hardened: handles
WAIT_ABANDONED(previous instance crashed holding the mutex) and stale coordinator-PID lockfiles — a second rapid launch can no longer silently no-op. - Round-trip verified lossless: mtime/ctime/Hidden/ReadOnly/System, Unicode names, deeply nested paths, and a 3000-file stress batch (SHA256-checked).
- Signed manifest (detached
latest.json.sig): the auto-update manifest is now cryptographically signed with Ed25519, preventing a compromised server from injecting a fake version or download URL. - Download size cap (100 MB): the updater rejects files exceeding 100 MB, preventing memory exhaustion from a poisoned manifest pointing at a huge file.
- Update-channel logging: failed update checks now write to
update.login the install folder, so silent update-channel failures are observable. - GitHub release asset verification:
deploy.ps1now size-verifies the GitHub release asset via the API, not just the exit code. - Path-length guard: right-clicking a file with a path longer than 247 characters shows a clear error instead of a confusing "not found".
- Slint attribution: added "Made with Slint" badge (Slint Royalty-free License §2).
- Extract Here: right-click
.zgx/.zip/.rar→ LRGEX → Extract Here (extracts to current folder, no subfolder)
- Removed
AppliesTofrom installer (was hiding the right-click menu on all files) - Added Extract Here to installer
.issfor all three archive extensions
- Fixed: right-click menu disappeared on all files due to malformed AppliesTo value
- N/A
- N/A
- N/A
- N/A
- N/A
- Installer-based auto-update: updates now download and run the full installer (not just the bare exe), ensuring registry entries, icons, and file associations are always updated correctly.
- Installer filename now includes full version number (e.g. v1.2.0, not v1.2).
CloseApplications=forceandRestartApplications=noadded to installer for silent updates.- App silently exits when launched with no arguments (fixes post-update restart error).
- N/A
- N/A
- N/A
- N/A
- N/A
- N/A
- Multi-format extraction:
.zipand.rarextraction added alongside.zgx. Magic-byte detection (zstd/zip/rar) with extension fallback. - Real
.rarprogress: vendored unrar 0.5.8 with UCM_PROCESSDATA counter patch for byte-level extraction progress. - Extract Here: right-click
.zgx/.zip/.rar→ Extract Here dumps contents into the current folder. - Multi-select compress: selecting multiple files/folders and right-clicking Compress produces ONE
.zgxcontaining all items. - Signed auto-updates: Ed25519 signature verification, deferred until after operation completes.
- 8-byte uncompressed total header in
.zgxformat for accurate extraction progress. - Batch-parallel extraction: rayon batch writer (2048 entries/64MB) with directory cache for many-small-files workloads.
- Version badge in lower right of progress window.
- Shimmer animation on progress bar fill.
- Auto-close 2s after successful operation.
- Cancel kills process immediately — no orphan threads.
- Window icon from product logo.
- op-label/op-detail split: action word in white bold, filename in silver.
- ZIP backend switched to
deflate-flate2-zlib-ng(C-accelerated, 4× faster decompression). [profile.dev.package."*"] opt-level = 3— dependencies compiled at -O3 even in debug builds.- File preallocation (
set_len) for entries >1MB during extraction. - BufReader 256KB between zstd decoder and tar (reduced from 4MB to avoid cache eviction).
- Removed redundant BufReader before zstd decoder (it reads 128KB chunks natively).
- Folder name stripping:
x.mdfolder →x.zgx(notx.md.zgx). - Stable install path for right-click verbs (survives exe rebuilds).
- Empty directories now preserved through compress → extract round-trip.
- Atomic writes:
name.zgx.part→name.zgxonly on full success. - Cancel during compress deletes the partial archive.
- Zip-slip protection (path traversal guard for both
.zipand.zgxextraction). - Failed extraction no longer hangs the UI (shows "Failed" instead of freezing).
- Many-small-files extraction is limited by Windows Defender real-time scanning (~5-15 MB/s). This is a documented Windows limitation, not a code issue.
- Right-click compression and extraction: one
LRGEXExplorer entry that opens a hover submenu (Compress on folders/files, Extract on.zgxarchives). Per-user, HKCU only, no UAC. .zgxarchive format: Double-clicking a.zgxextracts it.- Progress window: colored progress bar, live percent, MB/s, and ETA. A 500 ms heartbeat + animated spinner keep it from ever looking frozen, even on a cold cache.
- Byte-based progress: percentage is always
bytes_done / bytes_total(never file-count), so a single huge file does not sit at a misleading percent. - Multi-threaded compression: parallel reads across all CPU cores, designed for multi-gigabyte folders.
- Atomic archive writes: compress writes to
<name>.zgx.partand atomically renames to<name>.zgxonly on full success, so an interrupted or crashed compress can never leave a complete-looking partial archive. - Empty-directory preservation: directory entries are archived before their contents, so extraction restores the exact source tree, including empty folders.
- Cancel cleans up: aborting a compress releases the
.partfile and deletes it — no orphaned half-files are left behind. - Skip-with-warning on locked files: a single unreadable file does not fail a multi-GB job. The archive still publishes, and a
<name>.zgx.skipped.txtsidecar lists anything that could not be read (auto-deleted on the next clean run). - Signed auto-updates: Ed25519 signature verification on every update. The version check runs silently on launch; the download + verify + swap flow runs only after the current job finishes, so it can never interrupt or freeze a compress/extract in progress.
- Per-user installer: Inno Setup,
PrivilegesRequired=lowest(no UAC prompt). Registers the right-click cascade and the.zgxfile association, and removes every registry entry it created on uninstall. - Self-contained executable: a single ~14 MB
.exe, zero runtime dependencies (static CRT, software renderer) — runs anywhere, including VMs with no GPU.
- N/A
- N/A
- N/A
Developed by LRGEX