Преглед изворни кода

feat(api): Add `append` option to writeFile apis (#7636)

* feat(api): Add `append` option to writeFile apis.

* wording

* fmt

* Update .changes/fs-append-file.md


* clippeeeyyyy
Fabian-Lars пре 2 година
родитељ
комит
58d6b899e2
3 измењених фајлова са 30 додато и 2 уклоњено
  1. 6 0
      .changes/fs-append-file.md
  2. 18 2
      core/tauri/src/endpoints/file_system.rs
  3. 6 0
      tooling/api/src/fs.ts

+ 6 - 0
.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.

+ 18 - 2
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<BaseDirectory>,
+  /// Whether writeFile should append to a file or truncate it.
+  pub append: Option<bool>,
 }
 
 /// The API descriptor.
@@ -166,6 +171,11 @@ impl Cmd {
     contents: Vec<u8>,
     options: Option<FileOperationOptions>,
   ) -> 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),
       }
     }
   }

+ 6 - 0
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
 }