2

When saving a file using the File System Access API, if an error occurs between writing to and saving a new file, a file is still created and saved.

Is there a way to prevent this file from being created and saved?

As an example using the following code, an error is thrown before the save function is ran. This error prevents the save function from running; however, a file is still created.

let fileHandle;

async function save() {
  let stream = await fileHandle.createWritable();
  await stream.write();
  await stream.close();
}

async function saveFile() {
  const options = {
    types: [{
      description: 'Text File',
      accept: {
        'text/plain': '.txt'
      },
    }],
    excludeAcceptAllOption: true,
  }

  try {
    fileHandle = await window.showSaveFilePicker(options);
  } catch (err) {
    return;
  }

  throw "Some error occurs, preventing the 'save' function from being reached...";

  save();
}
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>File System Access Test</title>
  <script type="text/javascript" src="test.js"></script>
</head>

<body>
  <button type="button" onclick="saveFile()">Save File</button>
</body>

</html>

1
  • I guess perhaps you shouldn't show the save picker until you are sure that you have contents that should be saved. If you have these contents ready, then there should be no other possibilities for errors between opening and writing. Commented Nov 5, 2021 at 16:35

2 Answers 2

0

all preventions can be created through validations

For example create a class that validates the parameters that you require to be fulfilled and if the validation is correct then execute the save function.

Sign up to request clarification or add additional context in comments.

1 Comment

The problem is that the save function doesn't need to be executed for a file to be created and saved. If the save function isn't executed, data just isn't written to the created and saved file. You are just left with an empty file.
0

Your code is already working, I only moved the last lines because they are unnecessary.

I tested your code creating a folder that cannot create files inside

async function saveFile() {
  const options = {
    types: [{
      description: 'Text File',
      accept: {
        'text/plain': '.txt'
      },
    }],
    excludeAcceptAllOption: true,
  }

  // here i make the changes
  try {
    fileHandle = await window.showSaveFilePicker(options);
  save();

  } catch (err) {
    alert('failed')
  }

}

1 Comment

Unfortunately, a blank file is still created with your code suggestion.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.