diff --git a/.changes/fs-append-file.md b/.changes/fs-append-file.md new file mode 100644 index 000000000000..a55e0dcbbeb8 --- /dev/null +++ b/.changes/fs-append-file.md @@ -0,0 +1,6 @@ +--- +'@tauri-apps/api': 'patch:enhance' +'tauri': 'patch:enhance' +--- + +Add `append` option to `FsOptions` in the `fs` JS module, used in `writeTextFile` and `writeBinaryFile`, to be able to append to existing files instead of overwriting it. diff --git a/core/tauri/src/endpoints/file_system.rs b/core/tauri/src/endpoints/file_system.rs index 0acea50db38a..48e62f9bc564 100644 --- a/core/tauri/src/endpoints/file_system.rs +++ b/core/tauri/src/endpoints/file_system.rs @@ -23,7 +23,10 @@ use serde::{ }; use tauri_macros::{command_enum, module_command_handler, CommandModule}; -use std::fmt::{Debug, Formatter}; +use std::{ + fmt::{Debug, Formatter}, + fs::OpenOptions, +}; use std::{ fs, fs::File, @@ -49,6 +52,8 @@ pub struct FileOperationOptions { /// The base directory of the operation. /// The directory path of the BaseDirectory will be the prefix of the defined file path. pub dir: Option, + /// Whether writeFile should append to a file or truncate it. + pub append: Option, } /// The API descriptor. @@ -166,6 +171,11 @@ impl Cmd { contents: Vec, options: Option, ) -> super::Result<()> { + let append = options + .as_ref() + .and_then(|opt| opt.append) + .unwrap_or_default(); + let resolved_path = resolve_path( &context.config, &context.package_info, @@ -173,7 +183,12 @@ impl Cmd { path, options.and_then(|o| o.dir), )?; - File::create(&resolved_path) + + OpenOptions::new() + .append(append) + .write(true) + .create(true) + .open(&resolved_path) .with_context(|| format!("path: {}", resolved_path.display())) .map_err(Into::into) .and_then(|mut f| f.write_all(&contents).map_err(|err| err.into())) @@ -409,6 +424,7 @@ mod tests { fn arbitrary(g: &mut Gen) -> Self { Self { dir: Option::arbitrary(g), + append: Option::arbitrary(g), } } } diff --git a/tooling/api/src/fs.ts b/tooling/api/src/fs.ts index 9d47b8a19a46..956073e01860 100644 --- a/tooling/api/src/fs.ts +++ b/tooling/api/src/fs.ts @@ -110,6 +110,12 @@ export enum BaseDirectory { */ interface FsOptions { dir?: BaseDirectory + /** + * Whether the content should overwrite the content of the file or append to it. + * + * @since 1.5.0 + */ + append?: boolean // note that adding fields here needs a change in the writeBinaryFile check }