faet: single file process.
This commit is contained in:
+25
-4
@@ -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()?);
|
||||
|
||||
Reference in New Issue
Block a user