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;