diff --git a/backend/src/lib/outbound/file_system.rs b/backend/src/lib/outbound/file_system.rs index 286272d..c4a0f59 100644 --- a/backend/src/lib/outbound/file_system.rs +++ b/backend/src/lib/outbound/file_system.rs @@ -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

(path: P) -> io::Result +where + P: AsRef + 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) +} diff --git a/frontend/composables/useWarrenPath.ts b/frontend/composables/useWarrenPath.ts index 7640fea..a86f2a5 100644 --- a/frontend/composables/useWarrenPath.ts +++ b/frontend/composables/useWarrenPath.ts @@ -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 }; } diff --git a/frontend/lib/api/warrens.ts b/frontend/lib/api/warrens.ts index 40c7aad..cf45dfd 100644 --- a/frontend/lib/api/warrens.ts +++ b/frontend/lib/api/warrens.ts @@ -38,6 +38,7 @@ export async function getWarrenDirectory( warrenId, path, }), + key: `${warrenId}-${path}`, }); if (data.value == null) { diff --git a/frontend/pages/warrens/files.vue b/frontend/pages/warrens/files.vue index ba6e177..4b11526 100644 --- a/frontend/pages/warrens/files.vue +++ b/frontend/pages/warrens/files.vue @@ -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;