recursively get file size for directories

This commit is contained in:
2025-09-06 16:23:42 +02:00
parent 3329860b02
commit e1e97ef79d
4 changed files with 32 additions and 14 deletions

View File

@@ -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)
}

View File

@@ -1,9 +1,9 @@
export function useWarrenPath() {
export function useWarrenPath(): { warrenId: string; path: string } | null {
const store = useWarrenStore();
if (store.current == null) {
return null;
}
return `${store.current.warrenId}${store.current.path}`;
return { warrenId: store.current.warrenId, path: store.current.path };
}

View File

@@ -38,6 +38,7 @@ export async function getWarrenDirectory(
warrenId,
path,
}),
key: `${warrenId}-${path}`,
});
if (data.value == null) {

View File

@@ -36,7 +36,7 @@ if (warrenStore.current == null) {
useAsyncData(
'current-directory',
async () => {
if (warrenStore.current == null) {
if (warrenPath.value == null) {
return {
files: [],
parent: null,
@@ -47,8 +47,8 @@ useAsyncData(
warrenStore.loading = true;
const { files, parent } = await getWarrenDirectory(
warrenStore.current.warrenId,
warrenStore.current.path
warrenPath.value.warrenId,
warrenPath.value.path
);
warrenStore.loading = false;