recursively get file size for directories
This commit is contained in:
@@ -109,7 +109,7 @@ impl FileSystem {
|
|||||||
let mut files = Vec::new();
|
let mut files = Vec::new();
|
||||||
|
|
||||||
let mut dir = fs::read_dir(&dir_path).await?;
|
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 {
|
while let Ok(Some(entry)) = dir.next_entry().await {
|
||||||
let name = entry
|
let name = entry
|
||||||
@@ -129,8 +129,8 @@ impl FileSystem {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let metadata = fs::metadata(entry.path()).await?;
|
let file_size = FileSize::new(file_size_recursive(entry.path()).await?);
|
||||||
let entry_size = metadata.size();
|
|
||||||
let created_at = get_btime(entry.path());
|
let created_at = get_btime(entry.path());
|
||||||
|
|
||||||
let mime_type = match file_type {
|
let mime_type = match file_type {
|
||||||
@@ -138,13 +138,11 @@ impl FileSystem {
|
|||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
total_size += entry_size;
|
|
||||||
|
|
||||||
files.push(File::new(
|
files.push(File::new(
|
||||||
FileName::new(&name)?,
|
FileName::new(&name)?,
|
||||||
file_type,
|
file_type,
|
||||||
mime_type,
|
mime_type,
|
||||||
FileSize::new(entry_size),
|
file_size,
|
||||||
created_at,
|
created_at,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@@ -160,8 +158,6 @@ impl FileSystem {
|
|||||||
.context("Failed to get directory name")?,
|
.context("Failed to get directory name")?,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let parent_size = FileSize::new(total_size);
|
|
||||||
|
|
||||||
Some(File::new(
|
Some(File::new(
|
||||||
dir_name,
|
dir_name,
|
||||||
FileType::Directory,
|
FileType::Directory,
|
||||||
@@ -417,7 +413,7 @@ impl FileSystem {
|
|||||||
_ => None,
|
_ => 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);
|
let created_at = get_btime(&fs_path);
|
||||||
|
|
||||||
Ok(File::new(name, file_type, mime_type, file_size, created_at))
|
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)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
export function useWarrenPath() {
|
export function useWarrenPath(): { warrenId: string; path: string } | null {
|
||||||
const store = useWarrenStore();
|
const store = useWarrenStore();
|
||||||
|
|
||||||
if (store.current == null) {
|
if (store.current == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return `${store.current.warrenId}${store.current.path}`;
|
return { warrenId: store.current.warrenId, path: store.current.path };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ export async function getWarrenDirectory(
|
|||||||
warrenId,
|
warrenId,
|
||||||
path,
|
path,
|
||||||
}),
|
}),
|
||||||
|
key: `${warrenId}-${path}`,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (data.value == null) {
|
if (data.value == null) {
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ if (warrenStore.current == null) {
|
|||||||
useAsyncData(
|
useAsyncData(
|
||||||
'current-directory',
|
'current-directory',
|
||||||
async () => {
|
async () => {
|
||||||
if (warrenStore.current == null) {
|
if (warrenPath.value == null) {
|
||||||
return {
|
return {
|
||||||
files: [],
|
files: [],
|
||||||
parent: null,
|
parent: null,
|
||||||
@@ -47,8 +47,8 @@ useAsyncData(
|
|||||||
warrenStore.loading = true;
|
warrenStore.loading = true;
|
||||||
|
|
||||||
const { files, parent } = await getWarrenDirectory(
|
const { files, parent } = await getWarrenDirectory(
|
||||||
warrenStore.current.warrenId,
|
warrenPath.value.warrenId,
|
||||||
warrenStore.current.path
|
warrenPath.value.path
|
||||||
);
|
);
|
||||||
|
|
||||||
warrenStore.loading = false;
|
warrenStore.loading = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user