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