Skip to content

Commit 46a5a08

Browse files
committed
chore: development v0.2.107 - comprehensive testing complete [auto-commit]
1 parent 8acbfc6 commit 46a5a08

File tree

12 files changed

+194
-22
lines changed

12 files changed

+194
-22
lines changed

Cargo.lock

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ exclude = [
3939
# Workspace Package Metadata (inherited by all crates)
4040
# ─────────────────────────────────────────────────────────────────────────────
4141
[workspace.package]
42-
version = "0.2.106"
42+
version = "0.2.107"
4343
edition = "2024"
4444
rust-version = "1.85"
4545
license = "MPL-2.0 OR LicenseRef-UFFS-Commercial"

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Traditional file search tools (including `os.walk`, `FindFirstFile`, etc.) work
2121

2222
**UFFS reads the MFT directly** - once - and queries it in memory using Polars DataFrames. This is like reading the entire phonebook once instead of looking up each name individually.
2323

24-
### Benchmark Results (v0.2.106)
24+
### Benchmark Results (v0.2.107)
2525

2626
| Drive Type | Records | Time | Throughput |
2727
|------------|---------|------|------------|
@@ -33,7 +33,7 @@ Traditional file search tools (including `os.walk`, `FindFirstFile`, etc.) work
3333

3434
| Comparison | Records | Time | Notes |
3535
|------------|---------|------|-------|
36-
| **UFFS v0.2.106** | **18.7 Million** | **~142 seconds** | All disks, fast mode |
36+
| **UFFS v0.2.107** | **18.7 Million** | **~142 seconds** | All disks, fast mode |
3737
| UFFS v0.1.30 | 18.7 Million | ~315 seconds | Baseline |
3838
| Everything | 19 Million | 178 seconds | All disks |
3939
| WizFile | 6.5 Million | 299 seconds | Single HDD |

crates/uffs-mft/src/main.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ enum Commands {
312312
/// ```text
313313
/// uffs_mft save --drive C --output mft_c.mft
314314
/// uffs_mft save -d C -o mft_c.mft --no-compress
315+
/// uffs_mft save -d C -o mft_c.raw --raw # Compatible with other MFT tools
315316
/// ```
316317
Save {
317318
/// Drive letter to read MFT from (e.g., C, D, E)
@@ -329,6 +330,12 @@ enum Commands {
329330
/// Compression level (1-22, default 3)
330331
#[arg(long, default_value = "3")]
331332
compression_level: i32,
333+
334+
/// Raw compatibility mode: output raw MFT bytes without header.
335+
/// This format is compatible with other MFT tools like analyzeMFT,
336+
/// MFT2CSV. Note: --raw implies --no-compress.
337+
#[arg(long)]
338+
raw: bool,
332339
},
333340

334341
/// Load MFT from a saved file and export to parquet/csv
@@ -829,7 +836,8 @@ async fn dispatch_command(command: Commands) -> Result<()> {
829836
output,
830837
no_compress,
831838
compression_level,
832-
} => cmd_save(drive, &output, !no_compress, compression_level).await,
839+
raw,
840+
} => cmd_save(drive, &output, !no_compress, compression_level, raw).await,
833841
Commands::Load {
834842
input,
835843
output,
@@ -2429,6 +2437,7 @@ async fn cmd_save(
24292437
output: &Path,
24302438
compress: bool,
24312439
compression_level: i32,
2440+
raw_compat: bool,
24322441
) -> Result<()> {
24332442
use std::time::Instant;
24342443

@@ -2480,9 +2489,12 @@ async fn cmd_save(
24802489
.await
24812490
.with_context(|| format!("Failed to open drive {drive}:"))?;
24822491

2492+
// Raw compat mode implies no compression
24832493
let options = SaveRawOptions {
2484-
compress,
2494+
compress: if raw_compat { false } else { compress },
24852495
compression_level,
2496+
volume_letter: drive_upper,
2497+
raw_compat,
24862498
};
24872499

24882500
let header = reader
@@ -2531,7 +2543,9 @@ async fn cmd_save(
25312543
" Original size: {}",
25322544
format_bytes(header.original_size)
25332545
);
2534-
if header.is_compressed() {
2546+
if raw_compat {
2547+
println!(" Format: raw (compatible with other MFT tools)");
2548+
} else if header.is_compressed() {
25352549
println!(
25362550
" Compressed size: {}",
25372551
format_bytes(header.compressed_size)
@@ -2544,6 +2558,7 @@ async fn cmd_save(
25442558
println!(" Space saved: {savings:.1}%");
25452559
} else {
25462560
println!(" Compression: none");
2561+
println!(" Volume letter: {}:", header.volume_letter);
25472562
}
25482563
println!();
25492564
println!("⏱️ Completed in {}", format_duration(elapsed));

0 commit comments

Comments
 (0)