fat-rs/fat-dump/src/main.rs

77 lines
1.7 KiB
Rust
Raw Normal View History

use fat_bits::FatFs;
2025-07-30 21:39:45 +02:00
use fat_bits::dir::DirEntry;
2025-07-26 15:51:21 +02:00
pub fn main() -> anyhow::Result<()> {
let args = std::env::args();
if args.len() != 2 {
anyhow::bail!("usage: dump <path>");
}
let file = std::fs::File::open(args.skip(1).next().unwrap())?;
// let mut buf = [0; 512];
// file.read_exact(&mut buf)?;
// let bpb = Bpb::load(&buf)?;
// println!("{}", bpb);
let fat_fs = FatFs::load(file)?;
2025-07-26 15:51:21 +02:00
2025-08-01 18:09:45 +02:00
// println!("{}", fat_fs.bpb());
// println!();
// println!("{}", fat_fs.fat());
println!("{}", fat_fs);
2025-07-26 15:51:21 +02:00
println!();
println!(
"free clusters: {} ({} bytes)",
2025-08-01 18:09:45 +02:00
fat_fs.free_clusters(),
2025-08-01 22:42:13 +02:00
fat_fs.free_clusters() as usize
2025-08-01 18:09:45 +02:00
* fat_fs.bytes_per_sector() as usize
* fat_fs.sectors_per_cluster() as usize
2025-07-26 15:51:21 +02:00
);
2025-07-27 00:24:48 +02:00
println!();
println!();
2025-07-27 02:04:21 +02:00
tree(&fat_fs, false);
2025-07-27 00:24:48 +02:00
2025-07-26 15:51:21 +02:00
Ok(())
}
2025-07-27 00:24:48 +02:00
fn tree(fat_fs: &FatFs, show_hidden: bool) {
2025-07-27 00:24:48 +02:00
fn do_indent(indent: u32) {
for _ in 0..indent {
print!(" ");
}
}
fn tree_impl(
fat_fs: &FatFs,
iter: impl Iterator<Item = DirEntry>,
2025-07-27 02:04:21 +02:00
show_hidden: bool,
2025-07-27 00:24:48 +02:00
indent: u32,
) {
2025-07-27 02:04:21 +02:00
for dir_entry in iter.filter(|x| show_hidden || !x.is_hidden()) {
2025-07-27 00:24:48 +02:00
do_indent(indent);
println!("{}", dir_entry);
if dir_entry.is_dot() || dir_entry.is_dotdot() {
// do not descent into . and ..
continue;
}
if dir_entry.is_dir() {
2025-07-29 20:32:25 +02:00
let iter = fat_fs.dir_iter(dir_entry.first_cluster());
2025-07-27 00:24:48 +02:00
2025-07-27 02:04:21 +02:00
tree_impl(fat_fs, iter, show_hidden, indent + 1);
2025-07-27 00:24:48 +02:00
}
}
}
2025-07-27 02:04:21 +02:00
tree_impl(fat_fs, fat_fs.root_dir_iter(), show_hidden, 0);
2025-07-27 00:24:48 +02:00
}