FileSystemSyncAccessHandle: write() 方法

Baseline 已广泛支持

此功能已成熟,并可在许多设备和浏览器版本上运行。自 2023 年 3 月以来,它已在各种浏览器中可用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能仅在 专用 Web Worker 中可用。

FileSystemSyncAccessHandle 接口的 write() 方法会将指定缓冲区的内容写入与该句柄关联的文件,可以选择性地在给定偏移量处写入。

位于 origin private file system 内的文件对最终用户不可见,因此不受用户可见文件系统中文件运行的相同安全检查的约束。因此,使用 FileSystemSyncAccessHandle.write() 执行的写入操作性能更高。这使得它们适用于重要的、大规模的文件更新,例如 SQLite 数据库修改。

语法

js
write(buffer, options)

参数

buffer

一个 ArrayBufferArrayBufferView(例如 DataView),表示要写入文件的缓冲区。

options 可选

一个包含以下属性的选项对象

at

一个数字,表示缓冲区应写入文件的起始位置的字节偏移量。

注意: 您无法直接修改 ArrayBuffer 的内容。相反,您需要创建一个类型化数组对象,例如 Int8ArrayDataView 对象,它以特定格式表示缓冲区,并使用它来读取和写入缓冲区的内容。

返回值

一个数字,表示写入文件的字节数。

异常

InvalidStateError DOMException

如果关联的访问句柄已关闭,或者文件的二进制数据修改完全失败,则会抛出此异常。

QuotaExceededError

如果增加的数据容量超出了浏览器的 存储配额,则会抛出此异常。

TypeError

如果底层文件系统不支持从指定文件偏移量写入文件,则会抛出此异常。

示例

以下异步事件处理函数包含在 Web Worker 中。在接收到主线程的消息后,它会:

  • 创建一个同步文件访问句柄。
  • 获取文件大小并创建一个 ArrayBuffer 来存储它。
  • 将文件内容读入缓冲区。
  • 对消息进行编码并将其写入文件末尾。
  • 将更改持久化到磁盘并关闭访问句柄。
js
onmessage = async (e) => {
  // Retrieve message sent to work from main script
  const message = e.data;

  // Get handle to draft file
  const root = await navigator.storage.getDirectory();
  const draftHandle = await root.getFileHandle("draft.txt", { create: true });
  // Get sync access handle
  const accessHandle = await draftHandle.createSyncAccessHandle();

  // Get size of the file.
  const fileSize = accessHandle.getSize();
  // Read file content to a buffer.
  const buffer = new DataView(new ArrayBuffer(fileSize));
  const readBuffer = accessHandle.read(buffer, { at: 0 });

  // Write the message to the end of the file.
  const encoder = new TextEncoder();
  const encodedMessage = encoder.encode(message);
  const writeBuffer = accessHandle.write(encodedMessage, { at: readBuffer });

  // Persist changes to disk.
  accessHandle.flush();

  // Always close FileSystemSyncAccessHandle if done.
  accessHandle.close();
};

注意: 在规范的早期版本中,close()flush()getSize()truncate() 被错误地指定为异步方法,并且一些旧版本的浏览器以这种方式实现它们。然而,所有支持这些方法的当前浏览器都将其实现为同步方法。

规范

规范
文件系统
# api-filesystemsyncaccesshandle-write

浏览器兼容性

另见