use std::{fs, io, path::Path};
pub fn directory_logical_size(path: &Path) -> io::Result<u64> {
let mut total = 0_u64;
let metadata = fs::symlink_metadata(path)?;
if !metadata.is_dir() {
return Ok(metadata.len());
}
let mut pending = vec![path.to_owned()];
while let Some(current) = pending.pop() {
for entry in fs::read_dir(¤t)? {
let entry = entry?;
let metadata = entry.metadata()?;
if metadata.is_dir() {
pending.push(entry.path());
} else {
total = total.saturating_add(metadata.len());
}
}
}
Ok(total)
}
#[cfg(test)]
mod tests;