recursively get file size for directories
This commit is contained in:
@@ -109,7 +109,7 @@ impl FileSystem {
|
||||
let mut files = Vec::new();
|
||||
|
||||
let mut dir = fs::read_dir(&dir_path).await?;
|
||||
let mut total_size = 0_u64;
|
||||
let parent_size = FileSize::new(file_size_recursive(&dir_path).await?);
|
||||
|
||||
while let Ok(Some(entry)) = dir.next_entry().await {
|
||||
let name = entry
|
||||
@@ -129,8 +129,8 @@ impl FileSystem {
|
||||
}
|
||||
};
|
||||
|
||||
let metadata = fs::metadata(entry.path()).await?;
|
||||
let entry_size = metadata.size();
|
||||
let file_size = FileSize::new(file_size_recursive(entry.path()).await?);
|
||||
|
||||
let created_at = get_btime(entry.path());
|
||||
|
||||
let mime_type = match file_type {
|
||||
@@ -138,13 +138,11 @@ impl FileSystem {
|
||||
_ => None,
|
||||
};
|
||||
|
||||
total_size += entry_size;
|
||||
|
||||
files.push(File::new(
|
||||
FileName::new(&name)?,
|
||||
file_type,
|
||||
mime_type,
|
||||
FileSize::new(entry_size),
|
||||
file_size,
|
||||
created_at,
|
||||
));
|
||||
}
|
||||
@@ -160,8 +158,6 @@ impl FileSystem {
|
||||
.context("Failed to get directory name")?,
|
||||
)?;
|
||||
|
||||
let parent_size = FileSize::new(total_size);
|
||||
|
||||
Some(File::new(
|
||||
dir_name,
|
||||
FileType::Directory,
|
||||
@@ -417,7 +413,7 @@ impl FileSystem {
|
||||
_ => None,
|
||||
};
|
||||
|
||||
let file_size = FileSize::new(metadata.size());
|
||||
let file_size = FileSize::new(file_size_recursive(target_path).await?);
|
||||
let created_at = get_btime(&fs_path);
|
||||
|
||||
Ok(File::new(name, file_type, mime_type, file_size, created_at))
|
||||
@@ -716,3 +712,24 @@ impl PathRequest {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
async fn file_size_recursive<P>(path: P) -> io::Result<u64>
|
||||
where
|
||||
P: AsRef<Path> + std::fmt::Debug,
|
||||
{
|
||||
let metadata = fs::metadata(&path).await?;
|
||||
|
||||
if !metadata.is_dir() {
|
||||
return Ok(metadata.size());
|
||||
}
|
||||
|
||||
let mut entries = fs::read_dir(path).await?;
|
||||
|
||||
let mut total = metadata.size();
|
||||
|
||||
while let Some(entry) = entries.next_entry().await? {
|
||||
total += Box::pin(file_size_recursive(entry.path())).await?;
|
||||
}
|
||||
|
||||
Ok(total)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user