FileSystemSyncAccessHandle

Baseline 已广泛支持

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

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

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

FileSystemSyncAccessHandle 接口是 文件系统 API 的一部分,代表文件系统的同步访问句柄。

此类仅在专用的 Web Worker 中可访问(因此其方法不会阻塞主线程的执行),用于访问 源私有文件系统 中的文件,这些文件对最终用户不可见。

因此,其方法不像用户可见文件系统中的方法那样受到相同的安全检查,性能也更优越。这使得它们适用于大规模的文件更新,例如 SQLite 数据库的修改。

该接口通过 FileSystemFileHandle.createSyncAccessHandle() 方法访问。

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

实例属性

无。

实例方法

close()

关闭一个已打开的同步文件句柄,禁用对其的任何进一步操作,并释放先前为该文件句柄关联的文件设置的独占锁。

flush()

将通过 write() 方法对该句柄关联的文件所做的任何更改持久化到磁盘。

getSize()

返回该句柄关联的文件的字节大小。

read()

将该句柄关联的文件的内容读取到指定的缓冲区中,可选地指定偏移量。

truncate()

将该句柄关联的文件大小调整为指定的字节数。

write()

将指定缓冲区的内​​容写入该句柄关联的文件中,可选地指定偏移量。

示例

以下异步事件处理函数包含在 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();
};

规范

规范
文件系统
# api-filesystemsyncaccesshandle

浏览器兼容性

另见