From 905d8a61cccc4a6df1eb6a8b87c38f6f09c2890c Mon Sep 17 00:00:00 2001 From: Moritz Gmeiner Date: Sat, 26 Jul 2025 16:46:17 +0200 Subject: [PATCH 1/5] fixed bug in first_data_offset --- src/bpb.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/bpb.rs b/src/bpb.rs index 1b0a561..a1e42cf 100644 --- a/src/bpb.rs +++ b/src/bpb.rs @@ -250,12 +250,8 @@ impl Bpb { /// first data sector pub fn first_data_sector(&self) -> u32 { - println!("reserved sectors: {}", self.reserved_sector_count()); - println!("fat sectors: {}", self.num_fats() as u32 * self.fat_size()); - println!("root dir sectors: {}", self.root_dir_sectors()); - self.reserved_sector_count() as u32 - + (self.num_fats() as u32 + self.fat_size()) + + (self.num_fats() as u32 * self.fat_size()) + self.root_dir_sectors() as u32 } From 1785c0e7dd1b013e076693c8db412418491e643f Mon Sep 17 00:00:00 2001 From: Moritz Gmeiner Date: Sat, 26 Jul 2025 16:46:39 +0200 Subject: [PATCH 2/5] added Display for Attr shows flags ls-style --- src/dir.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/dir.rs b/src/dir.rs index 9f3160c..32c4be3 100644 --- a/src/dir.rs +++ b/src/dir.rs @@ -24,6 +24,27 @@ bitflags! { } } +impl Display for Attr { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut if_has_attr = |attr: Attr, c: char| { + if self.contains(attr) { + write!(f, "{}", c) + } else { + write!(f, "-") + } + }; + + if_has_attr(Attr::ReadOnly, 'R')?; + if_has_attr(Attr::Hidden, 'H')?; + if_has_attr(Attr::System, 'S')?; + if_has_attr(Attr::VolumeId, 'V')?; + if_has_attr(Attr::Directory, 'D')?; + if_has_attr(Attr::Archive, 'A')?; + + Ok(()) + } +} + #[derive(Debug)] pub struct RegularDirEntry { name: [u8; 11], From 1bfd7d3ba5fc15418b89f91cbb4d63663708f404 Mon Sep 17 00:00:00 2001 From: Moritz Gmeiner Date: Sat, 26 Jul 2025 16:47:12 +0200 Subject: [PATCH 3/5] DisEntry: use custom formatting for DateTime in Display --- src/dir.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/dir.rs b/src/dir.rs index 32c4be3..df1e8ed 100644 --- a/src/dir.rs +++ b/src/dir.rs @@ -76,10 +76,11 @@ impl Display for RegularDirEntry { write!( f, - "DirEntry {{ {: <16} created: {} modified: {} }}", + "DirEntry {{ {} {: <16} created: {} modified: {} }}", + self.attr, name, - self.create_time(), - self.write_time() + self.create_time().format("%a %b %d %H:%M:%S%.3f %Y"), + self.write_time().format("%a %b %d %H:%M:%S%.3f %Y") )?; Ok(()) From 56871201dd864bcb8d5803307e63b906566ed6d5 Mon Sep 17 00:00:00 2001 From: Moritz Gmeiner Date: Sat, 26 Jul 2025 16:47:36 +0200 Subject: [PATCH 4/5] DirEntry: add methods to check if is a file or a dir --- src/dir.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/dir.rs b/src/dir.rs index df1e8ed..03564a3 100644 --- a/src/dir.rs +++ b/src/dir.rs @@ -157,6 +157,16 @@ impl RegularDirEntry { self.name[0] == 0x00 } + pub fn is_file(&self) -> bool { + !self + .attr + .intersects(Attr::Directory | Attr::System | Attr::VolumeId) + } + + pub fn is_dir(&self) -> bool { + self.attr.contains(Attr::Directory) && !self.attr.intersects(Attr::System | Attr::VolumeId) + } + pub fn name(&self) -> &[u8] { &self.name } From b96805c1c40e486626887199e0c24f481c207981 Mon Sep 17 00:00:00 2001 From: Moritz Gmeiner Date: Sat, 26 Jul 2025 16:48:02 +0200 Subject: [PATCH 5/5] SubSlice(Mut): custom Debug implementation --- src/subslice.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/subslice.rs b/src/subslice.rs index 25063e8..4dbb43c 100644 --- a/src/subslice.rs +++ b/src/subslice.rs @@ -1,3 +1,4 @@ +use std::fmt::Debug; use std::io::{Read, Write}; use crate::{FatFs, SliceLike}; @@ -9,6 +10,15 @@ pub struct SubSliceMut<'a, S: SliceLike> { len: usize, } +impl Debug for SubSliceMut<'_, S> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("SubSliceMut") + .field("offset", &self.offset) + .field("len", &self.len) + .finish() + } +} + impl SubSliceMut<'_, S> { pub fn new(fat_fs: &mut FatFs, offset: u64, len: usize) -> SubSliceMut<'_, S> { SubSliceMut { @@ -70,6 +80,15 @@ pub struct SubSlice<'a, S: SliceLike> { len: usize, } +impl Debug for SubSlice<'_, S> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("SubSliceMut") + .field("offset", &self.offset) + .field("len", &self.len) + .finish() + } +} + impl SubSlice<'_, S> { pub fn new(fat_fs: &mut FatFs, offset: u64, len: usize) -> SubSlice<'_, S> { SubSlice {