Releases: purelogiccode/RomValidator
Release list
release_2.8.0
New Features
- Fluent Dark Theme — the UI is now built on WPF-UI with a professional Windows 11-style dark theme: a cohesive color palette (one blue accent, semantic green/red, neutral grays), dark ListView/GridView styling, and redesigned headers, buttons, and stat cards.
- Screenshot Capture (F8) — press F8 anywhere in the main window to save a PNG screenshot of the app to
%LOCALAPPDATA%\ROM Validator\Screenshot(works even when installed under Program Files). - App Data Button — the new App Data button (top-right, next to About) opens
%LOCALAPPDATA%\ROM Validatorin Explorer. Both the rolling logs (Logs\) and screenshots (Screenshot\) now live there, so you can find and share them in one click. - Binary DAT Detection — if you accidentally select a disc image, ROM, archive, or other binary file as a DAT, the app now recognizes common signatures (NES, CHD, 7z, RAR, GZIP, ZIP, PNG, PDF, RIFF) and shows a clear "incompatible file format" message instead of an XML parsing error.
- Large Archive Streaming — archive entries larger than 256 MB are now extracted to a temporary file instead of memory, eliminating out-of-memory crashes on big ROM sets.
- User-Error Classification — corrupt archives, cloud-only placeholder files, and locked files are now flagged as user-file errors: shown to you in the UI, but no longer sent to the developer as bug reports.
Improvements
- Serilog Logging — replaced the hand-rolled logger with Serilog (Debug + daily rolling file sink, 7 days retained). Errors and exceptions are automatically forwarded to the bug-report service with full environment details, with recursion protection so logging failures can never cascade.
- Smarter Temp-Directory Cleanup — deletion now retries with exponential backoff (up to ~22 s), falls back to individual file deletion after a forced GC, and then schedules background retries every 30 s until the folder is gone. No more "Failed to delete temp directory" errors when a file is momentarily locked.
- Bug-Report Noise Reduction — network/connectivity failures during the update check, and errors caused by the user's own files, are no longer reported as application bugs.
- Reliability Hardening — every user-facing action (navigation, browsing, cancel, reset, window close) is wrapped with error handling so a single failure can never take down the app; services are disposed in a safe order on shutdown.
- Version Check Tuning — HTTP errors and timeouts during the update check are handled gracefully and never crash startup.
Testing
- Added 104 unit and integration tests covering: hash calculation against known vectors (CRC32/MD5/SHA-1/SHA-256), empty/large/cancelled file scenarios, DAT model serialization, GitHub release parsing, bug-report payloads, logger behavior, and a regression test for temp-directory cleanup while a file is locked.
- Test SDK updated to 18.8.1.
Technical
- Upgraded dependencies: WPF-UI 4.3.0, Serilog 4.4.0, SharpSevenZip 2.0.109.
- Built with .NET 10.0, targeting Windows x64 and ARM64.
Full Changelog: release_2.7.1...release_2.8.0
release_2.7.1
Fix: Retry dialog when file is locked
When moving a file fails because it's locked by another process (e.g., an emulator or file manager), ROM Validator now shows a Retry/Cancel dialog instead of silently failing.
- Displays which file is locked
- Asks you to close the application using the file
- Click Retry to try again after closing the file
- Click Cancel to skip moving that file
Update: SharpSevenZip 2.0.91 → 2.0.99
Updated the 7-Zip library to the latest version.
Full Changelog: release_2.7.0...release_2.7.1
release_2.7.0
New Features
Startup Validation
- Application now detects if running from a temporary directory or directly from a compressed archive and prompts the user to extract to a permanent location before proceeding.
DAT File Validation
- Added file extension check — only
.datand.xmlfiles are accepted. - Added hint text below the DAT file path field: "Only No-Intro XML DAT files are supported."
- Improved error messages when incompatible formats are detected (ZIP, HTML, ClrMamePro, MAME).
Cloud Placeholder Support
- Cloud-only placeholder files (e.g., OneDrive files not downloaded locally) are now automatically skipped during validation and hashing operations.
- Skipped files are reported with a clear error message indicating the file needs to be downloaded first.
Duplicate File Handling
- Files that would overwrite existing files during rename operations now generate unique filenames instead of failing (e.g.,
game (1).rom,game (2).rom).
Improvements
Async Status Bar Updates
- All status bar messages now use an async pattern with cancellation support, improving UI responsiveness during long-running operations.
Rename Operations
- Archive internal file rename operations now use
Path.GetFileName()to prevent path traversal issues. - File move operations now correctly handle destination file overwrites.
File Enumeration
- File scanning now uses
EnumerationOptionsto skip hidden, system, and reparse point files for better performance and reliability.
Bug Fixes
- Fixed critical data loss bug where source files could be permanently deleted during archive rename operations when a filename collision occurred.
- Fixed font crash — added fallback fonts (
Courier New,Lucida Console) whenConsolasis unavailable, preventingSEHExceptioncrash on systems with missing fonts.
Dependency Updates
| Package | Old Version | New Version |
|---|---|---|
| SharpSevenZip | 2.0.36 | 2.0.49 |
| Microsoft.NET.Test.Sdk | 18.4.0 | 18.6.0 |
| coverlet.collector | 10.0.0 | 10.0.1 |
Full Changelog: release_2.6.1...release_2.7.0
release_2.6.1
- Disk-full errors: Added pre-extraction disk-space check with automatic fallback across all available drives. Stops the queue gracefully if no drive has enough space.
- Temp cleanup: All temp directories are now tracked and cleaned up after the validation queue finishes.
Full Changelog: release_2.6.0...release_2.6.1
release_2.6.0
🔍 Duplicate ROM Detection
- Automatically identifies duplicate ROM files (same hash, different filenames)
- New Duplicate Files Window displays duplicate groups with SHA256 hashes
- Duplicate files are moved to
_duplicatefolder during validation - Added "Duplicates" counter to validation statistics
📂 Enhanced Archive Support
- Automatically renames files inside archives to match DAT specifications
- RAR archives are converted to ZIP format when internal files need renaming
- Improved error handling for corrupted or damaged archives
🛡️ Strict No-Intro Validation
- Requires ALL hashes present in the DAT to match (strict No-Intro compliance)
- Warns about DAT files containing filename collisions (same filename, different hashes)
📝 Comprehensive Documentation
- Added extensive XML documentation to all public classes and methods
- Improved code readability and maintainability
🔄 Async Method Standardization
- Renamed async event handlers to follow
*_ClickAsyncnaming convention - Updated XAML event bindings for consistency
🧹 Code Cleanup
- Removed obsolete ExceptionHandler service
- Simplified BugReportService API payload structure
- Added global cancellation token support for application shutdown
🗂️ Archive Processing
- Fixed archive extraction error handling with specific exception types
- Improved error messages for corrupted archives
- Fixed buffer overflow in CRC32 algorithm
🔍 Validation Logic
- Fixed hash matching logic for strict No-Intro validation
- Enhanced error handling for "destination already exists" scenarios
🖥️ UI Improvements
- Added new UI styles for duplicate warning windows
- Fixed status bar update methods with async support
🔧 Service Architecture
- Moved ApplicationStatsService to centralized initialization
- Improved LoggerService exception formatting
Full Changelog: release_2.5.0...release_2.6.0
release_2.5.0
Archive Engine Overhaul
- Migrated from SharpCompress to SharpSevenZip: Replaced the archive library for better 7z support and LZMA2 compression
- Multi-Architecture Support: Added native 7z DLLs for both x64 and ARM64 architectures
- 7z Archive Creation: New capability to repackage renamed ROM files into 7z archives with LZMA2 compression
- Enhanced Archive Renaming: Now supports renaming files inside both ZIP and 7z archives
Error Handling & Bug Reporting
- Centralized Exception Handling: New
ExceptionHandlerservice with async/sync wrappers and automatic caller context capture - Enhanced Bug Reports: Structured error reporting with detailed environment info, error context, and full exception details including inner exceptions
- Global Exception Handlers: Added handlers for UI thread, non-UI thread, and unobserved task exceptions
📊 DAT Format Compliance
- Proper No-Intro XML Namespaces: DAT files now serialize with correct xsi namespace and schema location attributes
- Updated Default URLs: Changed homepage/URL defaults to No-Intro official site
🎨 UI Improvements
- Centralized Styling: Major refactor of XAML resources with organized color definitions and reusable styles
- New button styles (Start, Cancel, Download, Close)
- Standardized TextBlock styles (Header, SubHeader, Label, etc.)
- Consistent Border styles (Card, Option, ProgressBar, Stats Panel)
- Standard GridSplitter and ProgressBar styles
- Better Color Management: All brushes now defined as static resources with hover/pressed variants
📝 Logging Enhancements
- Expanded LoggerService: New methods for logging exceptions, warnings, info, and debug messages
- Structured Exception Logging: Detailed exception capture with type, message, stack trace, and inner exceptions
🔩 Technical Changes
- Hash Calculator: Now uses SharpSevenZip for all archive operations with improved stream handling
- App.xaml.cs: Fully implemented with SevenZip library initialization, global exception handling, and bug report service integration
Full Changelog: release_2.4.0...release_2.5.0
release_2.4.0
This release marks a significant milestone in the evolution of ROM Validator, focusing on architectural stability, performance optimizations, and enhanced support for the No-Intro ecosystem.
🔍 Enhanced Validation & DAT Support
- SHA256 Support: Full integration of SHA256 hashing for No-Intro XML DATs, including parsing, indexing, and multi-hash verification.
- Improved Format Detection: Advanced scanner to proactively identify and reject incompatible formats (ClrMamePro text, MAME XML, HTML, and ZIP) with descriptive user notifications.
- Smart File Renaming: New option to automatically rename local files to match DAT entries when hashes match but filenames differ.
- Internal Archive Renaming: Added support for renaming files inside ZIP archives to ensure full collection compliance.
- Multi-ROM Support: Improved handling of game entries containing multiple ROM files.
🚀 Performance & Reliability
- Library Migration: Replaced
SevenZipSharpwith SharpCompress, enabling native support for Zip, 7z, and RAR without requiring external 7z DLL dependencies. - Async Architecture: Fully migrated to
OpenArchiveandOpenEntryStreamAsyncAPIs for non-blocking I/O. - UI Responsiveness:
- Implemented background file counting for dynamic, accurate progress bar updates.
- Added UI virtualization (limiting displayed logs to 500 items) to prevent lag during large scans.
- Offloaded DAT serialization to background threads.
- Thread Safety: Integrated
Interlockedcounters and thread-safe buffers for UI updates.
📂 Collection Management
- Permanent Deletion: Added a safety-confirmed option to permanently delete failed or unknown files from the disk.
- Sequential Processing: Switched to a robust sequential processing model to prevent race conditions during file move/rename operations.
- ZIP Fallback: Added a fallback extraction mechanism for ZIP files using incompatible compression methods.
💻 System & UX
- Centralized Logging: Introduced
LoggerServicefor standardized error and activity logging. - Automatic Bug Reporting: Integrated
BugReportServiceto automatically capture and report application exceptions for faster troubleshooting. - Modern Standards: Updated codebase to .NET 10 and C# 14, utilizing
GeneratedRegexand other modern language features.
Note: This version exclusively supports No-Intro XML DAT files. Users attempting to load ClrMamePro or MAME-specific DATs will be notified to download compatible XML files from the No-Intro website.
release_2.3.1
Improve DAT file validation to detect ClrMamePro text format.
release_2.3.0
- Add retry logic with exponential backoff for file access errors during hash computation.
- Improve exception handling for locked files.
- Use
Interlocked.Incrementfor thread-safe counter updates. - Improve file validation with error logging for missing files.
- Fix CRC32 computation to return big-endian byte order.
- Improve regex handling with
GeneratedRegexattribute. - Enhance exception handling for cancellation propagation.
- Simplify
Disposecalls across services and view models.
release_2.2.0
Enhanced No-Intro DAT compatibility and overall robustness. Key changes include:
- Archive Support: Added support for extracting and processing multiple ROMs from archive files (e.g., .zip, .7z) during DAT generation.
- No-Intro DAT Generation: Refactored DAT generation to group and aggregate ROM files by
GameName, aligning with the No-Intro DAT format, allowing a singleGameentry to contain multipleRomelements. - Robust DAT Validation: Greatly enhanced DAT file parsing with stricter No-Intro XML validation, detection of incompatible formats (like ClrMamePro text), detailed error handling, and file previews for improved debugging and bug reporting.
- Comprehensive Hash Checking: Modified hash validation logic to ensure all provided hashes (SHA1, MD5, CRC32) must match for a ROM to be considered valid, and provides detailed mismatch reasons.
- Performance & Stability: Improved UI update performance during hashing via batching, and implemented more robust cancellation token handling across validation and generation processes.
- Centralized Logging: Introduced a
LoggerServicefor centralized error logging, replacing directConsole.Errorcalls. - Model Alignment: Updated
Datafile,Game,Header, andRommodels to strictly adhere to the No-Intro XML DAT schema, removing MAME-specific attributes and adding No-Intro relevant ones (e.g.,Category,Date,Retool,Status,Serial). - Bug Fixes: Corrected an out-of-bounds error in CRC32 computation logic and enhanced filename sanitization using compiled regular expressions.
- Minor Improvements: Replaced collection initializations with
new()syntax, enhanced LINQ withstaticlambdas, and increased max sample length for XML sample reporting in bug reports.