- The Avalonia render-pass crash (bug reports #68051/#68052) is no longer reported as an application bug. Applying a control template while a
TextBlockcontaining inline controls was measured made Avalonia invalidate a visual during the render pass. The About window no longer embeds its links inline, and the framework exception is now classified as an environment condition so stale builds cannot flood the bug-report API with it. - Opening the browser no longer produces duplicate bug reports on systems with a broken URL association (bug reports #68197/#68198). When shell execution failed ("Class not registered" - e.g. clicking a driver download link on a machine with a partially broken shell registration), the failure was reported twice: once as a warning carrying the exception and once as an error carrying only the message. On Windows the URL is now retried through the URL protocol handler (
rundll32 url.dll,FileProtocolHandler), shell-launch failures are classified as environment conditions, and each failure reaches the API at most once (the in-app mirror is informational).
- Dependency updates: Avalonia 12.1.4, SharpCompress 0.50.5, Meziantou.Analyzer 3.0.299 and xunit.runner.visualstudio 4.0.1; the separate Roslynator code-analysis and formatting packages were consolidated into the single
Roslynator.Analyzers5.0.1 package. - Documentation refresh for the 3.1.1 release (version references and the packaging guide); the developer review notes file
Todo.mdwas removed from the repository. - The suite now contains 1,466 tests and stays analyzer-warning-clean.
- Linux and macOS support - one application, three filesystem backends. The former Dokan and WinFsp executables are merged into a single cross-platform Avalonia app: Dokan (the Windows default) or WinFsp on Windows and FUSE (libfuse3 on Linux, macFUSE on macOS) everywhere else. Install either Windows driver and pick it in Settings (Auto prefers WinFsp when installed). Folder mounts work on every platform; drive-letter and cross-integrity mounts remain Windows-only. Six release bundles are produced:
win-x64,win-arm64,linux-x64,linux-arm64,osx-x64,osx-arm64. - Missing-driver warning with a download offer. On an interactive start the app checks the driver required by the selected backend (Dokan/WinFsp on Windows, libfuse3/macFUSE elsewhere) and, when it is missing, shows a message box explaining what is needed and asking whether to open the matching download page.
- The 7-Zip extraction fallback now works on every platform. Instead of loading a native
7z.dll, the app runs a bundled 7-Zip command-line binary -7za.exeon Windows, statically linked7zzson Linux, universal7zzon macOS - streamed straight into the cache. Entry names are mapped through7z l -slt, so backslash-separated and wildcard-containing names ([,]) extract correctly; standard input is closed so a missing password can never hang a prompt. - Screenshot fallback location. Pressing
F8saves to theScreenshotfolder next to the app; when that folder is read-only (e.g. Program Files), the image is saved to%LOCALAPPDATA%\SimpleZipDrive\Screenshotand the actual error is reported if both fail.
- FUSE: unmounting while the session was still starting could deadlock the mount permanently. The mount callback runs on the FUSE loop thread; it now requests a clean exit without waking the loop with a mount-point request (which could only be served by that same blocked thread). Unmount also no longer freezes the UI while waking the session, no longer reports success when the session is still alive, and a failed unmount says so instead of pretending the drive is gone.
- Mount lifecycle races and leaks. A mount aborted during startup now always disposes the archive core and file handle;
Disposeno longer races a starting mount; failed mounts no longer leave staleIsMounted/CurrentMountPoint/CurrentArchivePathstate; and a transiently failing FUSE loop can no longer be disposed underneath live callbacks. - Disk-cache extraction. Extraction of a shared archive stream is now fully serialized, the 7-Zip fallback is attempted for any extraction exception (including corrupt data surfaced through a BCL frame), fallback results are cached under the same key every other path uses (no duplicate extraction per handle), a deleted temp directory is no longer recreated after shutdown, and a failed instance can no longer unregister another instance's protected temp directory.
- Dialogs answer the keyboard again. Message boxes now honour Enter (default button) and Escape (Cancel/No), exactly like the WPF
MessageBoxthey replaced; concurrent password prompts are serialized instead of nesting dispatcher loops, and dialogs are owned by the active window (so a prompt opened from Settings is not stacked behind the main window). - Shutdown hardening. The update prompt can no longer appear after shutdown began, the log writer's token source is no longer disposed while its background task is still using it, and the screenshot file-name helper no longer overwrites the 1000th same-millisecond capture.
- Error reporting is narrower where it should be. Only WinFsp assembly-load failures and missing application data/temp paths are treated as environment conditions; missing unrelated assemblies or paths are reported again instead of being silently suppressed. Missing/unsupported filesystem drivers (Dokan, WinFsp, libfuse3, macFUSE) and a backend that does not exist on the current OS are also environment conditions now, so the startup warning can no longer send a bogus "libfuse3 not found: FUSE is only available on Linux and macOS" report from a Windows machine (bug report #68046).
- A settings file moved between platforms can no longer produce a nonsensical driver warning. The startup driver check and the mount-backend selection normalize the persisted backend for the current platform first (FUSE → Dokan on Windows, Dokan/WinFsp → FUSE on Linux/macOS), matching the normalization already applied when settings are loaded.
F1now actually opens the About window. The Help → About menu advertisedF1throughInputGesture, which is display-only in Avalonia; it is now a realHotKey.- Mount service no longer blocks the UI thread on unmount. The backend facade now disposes the previous backend on a background thread (its driver grace delay used to freeze the interface for ~0.5 s after every unmount and failed mount) and publishes the new backend only after the old one has been unmounted and released, so a concurrent unmount can never target the wrong instance.
- Packaging. Linux/macOS bundles no longer contain the Windows-only
winfsp-msil.dll; every bundle ships a combined7zip-license.txtcovering both the Windows and Unix binaries; the Unix 7-Zip binaries are committed executable. The packaging script can now produce all six bundles from any host - on Windows it writes the Unix zips throughSystem.IO.Compressionand records the Unix executable bit (host byte + external attributes) sounziprestores0755on the apphost and the 7-Zip binary (verified end-to-end on a Linux VM). The host-byte patch walks the real central directory located through the end-of-central-directory record instead of scanning the file for thePK\x01\x02signature, so a signature-looking byte sequence inside compressed entry data can no longer be overwritten and corrupt a bundle.
- About window redesigned. It now shows the application icon, the three-part release version (
3.1.0instead of3.1.0.0), and platform-specific credits - WinFsp/DokanNet on Windows, FUSE (FuseSharp) on Linux/macOS, and SharpCompress everywhere - with cleanly spaced links (the old inline links rendered stray spaces such as "WinFsp ," and "GPLv3 ."). The developer website (www.purelogiccode.com) is now a clickable link, and the dialog sizes itself to its content, removing the large empty gap above the Close button. - Donate button. A Donate button on the main toolbar - on the Mount/Unmount row, at the far right - opens https://www.purelogiccode.com/donate (with a fallback dialog if the browser cannot be launched).
- Windows now defaults to the Dokan backend. New installs mount through Dokan; WinFsp remains fully supported - install it and select WinFsp (or Auto) in Settings. The Settings list now offers only the platform's backends (Dokan/WinFsp on Windows, FUSE on Linux/macOS); a settings file moved between platforms is normalized on load. The README and docs explain that either Windows driver can be used and how to install the one you want.
- The 7-Zip fallback no longer depends on the
SharpSevenZippackage; the vendored 7-Zip 26.03 binaries live underSimpleZipDrive/7zip/and ship one per runtime identifier. Note: the Windows7za.exedoes not read RAR (SharpCompress remains the primary RAR reader; Linux/macOS7zzcan also read RAR). - Passwords for fallback extraction are passed as a command-line argument to the short-lived 7-Zip process (see Security & Privacy); the process runs headless and exits as soon as the entry is extracted.
- All 37 findings from the deep review that preceded this release are fixed; the suite grew to 1,454 tests and stays analyzer-warning-clean.
- Documentation (
docs/) is published both as the repository wiki (side menu indocs/_Sidebar.md) and as a GitHub Pages site (just-the-docs navigation viadocs/_config.yml).
- Dokan variant: mount-point failures are now detected by error status instead of error text (issue #67092). The retry guard matched the English-only message "Can't install", so on localized systems (DokanNet ships German, French, and Swedish resources) it silently broke and deterministic failures were pointlessly retried, adding ~3 s of latency per failed mount. Retries are now gated on
DokanException.ErrorStatus: only the transientErrorandStartErrorstatuses are retried; driver-install, drive-letter/mount-point, and version failures fail immediately. - Dokan variant: a failed drive letter or mount folder now shows a dedicated "Mount Point Unavailable" dialog instead of the misleading reinstall-driver dialog. It explains that the letter or folder may already be in use or that permission is missing, and suggests a different letter/folder or running as administrator.
- Update checks now read the current version from the Core assembly (version-pinned to both app executables) instead of
Assembly.GetEntryAssembly(), which under IDE test runners is the test host and made the "same version" tests spuriously notify the user when the runner version was below the latest release. - Updated
Meziantou.Analyzerto 3.0.259,SharpSevenZipto 2.0.128,Microsoft.NET.Test.Sdkto 18.10.1, and the GitHub Actions (checkout v5, setup-dotnet v5, upload-artifact v7, download-artifact v8); restored trailing newlines accidentally removed from six Core source files by the analyzer cleanup.
- ZArchive (
.zar) mount support with true Zstd seekable random access..zarcontainers are mounted via ZArchiveSharp, a pure C# implementation of the Zstd seekable format with no native dependencies. Every read decompresses only the 64 KiB zstd blocks it touches, so files are never extracted to memory or a temporary directory - seeks are immediate, and opening a 20 GB container costs the same as opening a 20 MB one. This also brings seekable-zstd support to the Xbox 360 scene, the main producer of this format (issue #5). - Xbox XISO disc image support (
.iso,.xiso,.cso) via XISOSharp. Original Xbox and Xbox 360 game images mount directly, in all common disc layouts (RAW, rebuilt sector-0, GLOBAL/XGD2, XGD3, XGD2 Hybrid, XGD1). File data is read on demand straight from the disc sectors; compressed CISO.csocontainers (single file or split.1.csopart sets) are decoded block-by-block per read. Generic ISO 9660/UDF data discs are rejected at mount time with a clear "not a valid Xbox XISO disc image" message. - Automated releases (GitHub Actions). Every push/PR builds the solution warning-clean and runs the full test suite. The release workflow produces the four
release_<version>_<Variant>_win-<arch>.zipbundles (Dokan/WinFsp x x64/ARM64) and waits for manual approval in a protected environment before creating the GitHub release - bundles can be downloaded and reviewed as workflow artifacts first.
- Archive detection, file dialogs, and error messages now include the new formats.
.iso,.xiso, and.csomap to the XISO reader;.zarmaps to the ZArchive reader. Xbox image mounts are read-only and passwordless, like every other supported format. - Xbox image note: because
.isosupport targets the Xbox XDVDFS filesystem only, mounting a regular (non-Xbox) ISO image now produces a specific format error instead of the generic "not a supported archive" rejection.
- Added
XISOSharp1.2.0; updatedZArchiveSharpto 1.3.0. - Updated
Meziantou.Analyzerto 3.0.257 across all projects. - New
XisoArchive/XisoArchiveEntry/XisoEntryStreamadapters with dedicated test coverage (adapter plusZipFileSystemCoreintegration, path-backed, stream-backed,.cso, and cyclic-image coverage); the suite now runs 1,245 tests. - Pre-release hardening: ZArchive extended-length (
128+character) names decode correctly, corrupt ZArchive blocks fail the entry instead of caching truncated data, cyclic/corrupt XISO directory tables terminate instead of hanging the mount, and a corrupt-image mount no longer leaks the image handle. - Docs in
docs/sync automatically to the repository wiki;WhatsNew.mdis tracked in the repository again so it ships inside every bundle.
- Outdated Dokan drivers are blocked with a clear dialog instead of crashing the app. DokanNet 2.3 requires the
DokanRegisterWaitForFileSystemClosedexport, which only exists in dokan2.dll 2.3.0+. On older Dokan installations (2.2.x and earlier) every mount crashed the process with an uncatchableEntryPointNotFoundException(crash reports #66665–#66667). Mounts are now refused up front with a "Dokan Driver Outdated" dialog showing the installed and required versions and offering to open the Dokan download page. - WinFsp variant: clear error instead of a raw assembly-load crash when
winfsp-msil.dllis missing. If the interop library was removed beside the executable (typically by antivirus software) or the package was extracted incompletely, mounting previously failed withCould not load file or assembly 'winfsp-msil'. The app now verifies the interop assembly can be loaded before every mount and shows a plain-language dialog explaining how to restore the file. This failure is also recognized as an environment condition, so it no longer floods the bug-report API. - Dokan variant: architecture mismatches detected during the version check now show the correct "Dokan Driver Incompatible" dialog instead of the outdated-driver dialog with a bogus "Installed version: 0.0.0".
- Dokan driver requirement documented: Dokan v2 2.3.0 or newer (ReadMe, docs, and the new dialog all state this).
- Halved peak memory during memory-cache decompression. Decompression now streams directly into the final exact-size buffer instead of building a growing
MemoryStreamand copying it withToArray(). A 424 MB entry now peaks at roughly one copy of the data (first-open working set ~460 MB, down from ~880 MB) — this addresses the memory-inflation follow-up reported in issue #10: the previous transient double copy made Task Manager show about twice the true footprint, and any second transient allocation could look like memory "doubling" between runs. - Bug-report filtering no longer masks potential real bugs. Only canceled HTTP requests are treated as expected user errors; other network failures and
CryptographicExceptions that do not originate from archive decryption (SharpCompress) are reported to the bug API again. The update check remains quiet on offline machines because it handles its own network errors. - Corrupt RAR archives are no longer misclassified as wrong-password prompts. A "Unknown Rar Header" failure during an encrypted mount now routes to the corruption path instead of re-prompting for a password up to three times with a misleading message.
- Duplicate log suppression restored to case-sensitive comparison, so two distinct messages that differ only in case are both kept.
- The archive open retry backoff no longer blocks the UI thread. Waiting for a transiently locked archive file uses an awaited delay instead of
Thread.Sleep. - WinFsp variant: fixed mount failure "The path is empty" in the packaged single-file build. The winfsp-msil interop's static initializer calls
FileVersionInfo.GetVersionInfo(Assembly.Location), which is an empty string inside a single-file bundle.winfsp-msil.dllis now shipped as a real file beside the executable so the interop version check succeeds. - WinFsp variant: fixed cross-integrity folder mounts on fresh directories.
IsDriveLetterMountPointmisclassified every absolute folder path (C:\...) as a drive letter, so the mount-point directory was never created and mounting failed with0xC0000034. A bareMorM:is a drive letter; any longer path is a folder and is created on demand.
- Consistent packaging for both variants. The Dokan and WinFsp executables ship with the native
7z.dll/7z_arm64.dllfallback libraries (andwinfsp-msil.dllfor the WinFsp variant) as real files beside the executable, so the SevenZip extraction fallback is available in both.
- Update check now uses the canonical repository endpoint (
https://github.com/purelogiccode/SimpleZipDrive). The fallback endpoint pointing at the previous repository owner was removed now that the GitHub transfer is complete. - Framework-dependent single-file executables. Releases are now built without the .NET runtime embedded — only the .NET Desktop Runtime and the filesystem driver (Dokan or WinFsp) remain prerequisites. Each package contains the single
exe, the native7z.dll/7z_arm64.dllfallback libraries (andwinfsp-msil.dllfor the WinFsp variant) beside it, plus this README, the license, and these release notes.
- ReDoS-safe match timeouts added to all regular expressions.
- Lock objects migrated to
System.Threading.Lock. - Solution reorganized with dedicated
Models/andInterfaces/folders;ErrorLoggerandStoredEntryStreamsplit into per-type files; all analyzer warnings resolved. - SharpCompress updated to 0.50.4 and SharpSevenZip to 2.0.115.
- Shared, refcounted memory cache for decompressed entries with LRU eviction (issue #10). Each entry is decompressed once and the buffer is shared by every open handle and on-demand read; buffers stay warm after the last handle closes and are evicted least-recently-used under memory pressure, falling back to the disk cache. This eliminated the one-full-decompression-per-open behavior (memory scaling as concurrent opens × file size) and the re-decompression-per-read path used by paging I/O.
- Graceful handling of entry-semaphore disposal during shutdown.
- WinFsp variant aligned with stable WinFsp 2.1 (the 2.2.x driver packages were beta releases).