|
3 | 3 | // SPDX-License-Identifier: Apache-2.0 |
4 | 4 | // SPDX-License-Identifier: MIT |
5 | 5 |
|
| 6 | +use anyhow::Ok; |
6 | 7 | use serde::{Deserialize, Serialize, Serializer}; |
7 | 8 | use serde_repr::{Deserialize_repr, Serialize_repr}; |
8 | 9 | use tauri::{ |
@@ -897,6 +898,55 @@ pub fn exists<R: Runtime>( |
897 | 898 | Ok(resolved_path.exists()) |
898 | 899 | } |
899 | 900 |
|
| 901 | +#[tauri::command] |
| 902 | +pub async fn size<R: Runtime>( |
| 903 | + webview: Webview<R>, |
| 904 | + global_scope: GlobalScope<Entry>, |
| 905 | + command_scope: CommandScope<Entry>, |
| 906 | + path: SafeFilePath, |
| 907 | + options: Option<BaseOptions>, |
| 908 | +) -> CommandResult<u64> { |
| 909 | + let resolved_path = resolve_path( |
| 910 | + &webview, |
| 911 | + &global_scope, |
| 912 | + &command_scope, |
| 913 | + path, |
| 914 | + options.as_ref().and_then(|o| o.base_dir), |
| 915 | + )?; |
| 916 | + |
| 917 | + let metadata = resolved_path.metadata()?; |
| 918 | + |
| 919 | + if metadata.is_file() { |
| 920 | + Ok(metadata.len()) |
| 921 | + } else { |
| 922 | + let size = get_dir_size(resolved_path).map_err(|e| { |
| 923 | + format!( |
| 924 | + "failed to get size at path: {} with error: {e}", |
| 925 | + resolved_path.display() |
| 926 | + ) |
| 927 | + })?; |
| 928 | + |
| 929 | + Ok(size) |
| 930 | + } |
| 931 | +} |
| 932 | + |
| 933 | +fn get_dir_size(path: PathBuf) -> CommandResult<u64> { |
| 934 | + let mut size = 0; |
| 935 | + |
| 936 | + for entry in std::fs::read_dir(path)? { |
| 937 | + let entry = entry?; |
| 938 | + let metadata = entry.metadata()?; |
| 939 | + |
| 940 | + if metadata.is_file() { |
| 941 | + size += metadata.len(); |
| 942 | + } else if metadata.is_dir() { |
| 943 | + size += get_dir_size(entry.path())?; |
| 944 | + } |
| 945 | + } |
| 946 | + |
| 947 | + Ok(size) |
| 948 | +} |
| 949 | + |
900 | 950 | #[cfg(not(target_os = "android"))] |
901 | 951 | pub fn resolve_file<R: Runtime>( |
902 | 952 | webview: &Webview<R>, |
|
0 commit comments