faet: single file process.

This commit is contained in:
2025-12-22 05:23:04 +08:00
parent fe1f883b0d
commit 6943ac8ef5
7 changed files with 187 additions and 31 deletions
+25 -4
View File
@@ -11,7 +11,7 @@ use std::time::Instant;
use anyhow::{Context, Result};
use clap::Parser;
use meta::{calc_xxh128, scan_dir_xxh128, DirSnapshot, FileMeta};
use meta::{calc_xxh128_with_callback, scan_dir_xxh128, DirSnapshot, FileMeta, ProgressTracker};
fn main() -> Result<()> {
let started = Instant::now();
@@ -43,8 +43,18 @@ fn process_file(path: &Path) -> Result<()> {
.map(|n| n.to_string_lossy().to_string())
.unwrap_or_else(|| "unknown".to_string());
let save_path = meta_dir.join(format!("{basename}.json"));
// 获取文件大小
let file_size = fs::metadata(path)
.with_context(|| format!("无法读取文件信息: {}", path.display()))?
.len();
if !save_path.exists() {
let meta = FileMeta::from_path(path)?;
let tracker = ProgressTracker::new_single_file(file_size, &basename);
let on_bytes = tracker.bytes_callback();
let on_iop = tracker.iop_callback();
let meta = FileMeta::from_path_with_callback(path, on_bytes, on_iop)?;
tracker.finish("处理完成");
let json = meta.to_pretty_json()?;
println!("{}", json);
fs::write(&save_path, json)?;
@@ -54,7 +64,14 @@ fn process_file(path: &Path) -> Result<()> {
let existing = File::open(&save_path)
.with_context(|| format!("无法读取历史元数据: {}", save_path.display()))?;
let old_meta = FileMeta::from_reader(existing)?;
let fast_hash = calc_xxh128(path)?;
// 使用进度条计算快速哈希
let tracker = ProgressTracker::new_single_file(file_size, &basename);
let on_bytes = tracker.bytes_callback();
let on_iop = tracker.iop_callback();
let fast_hash = calc_xxh128_with_callback(path, on_bytes, on_iop)?;
tracker.finish("校验完成");
if fast_hash == old_meta.xxh128 {
println!("校验通过.");
return Ok(());
@@ -62,7 +79,11 @@ fn process_file(path: &Path) -> Result<()> {
println!("校验失败!");
println!("现校验文件:");
let meta = FileMeta::from_path(path)?;
let tracker = ProgressTracker::new_single_file(file_size, &basename);
let on_bytes = tracker.bytes_callback();
let on_iop = tracker.iop_callback();
let meta = FileMeta::from_path_with_callback(path, on_bytes, on_iop)?;
tracker.finish("处理完成");
println!("{}", meta.to_pretty_json()?);
println!("原校验文件:");
println!("{}", old_meta.to_pretty_json()?);