针对在浏览器中处理文件的 API 改进

支持 FileSystemSyncAccessHandle 的多个读取器和写入器,以及 FileSystemWritableFileStream 的独占写入器。

FileSystemSyncAccessHandle 的多个读取器和写入器

借助源私有文件系统(有时也称为存储分区文件系统),开发者可以访问经过优化以实现最佳读写性能的文件。这通过 FileSystemSyncAccessHandle 对象实现。目前,如果尝试为同一文件条目打开多个 FileSystemSyncAccessHandle 对象,会失败并返回 NoModificationAllowedError。由于存在这种限制条件存在限制的用例,因此 Chrome 121 为 FileSystemFileHandle.createSyncAccessHandle() 方法引入了一个新的 mode 参数,其中包含以下允许的字符串值:

  • "readwrite":这是当前默认值。打开后,系统会允许使用 FileSystemSyncAccessHandle 上的任何方法。只允许有一个 FileSystemSyncAccessHandle 实例。
  • "read-only":允许多个读取器。打开后,对 FileSystemSyncAccessHandle 仅允许读取类方法:read()getSize()close()。可以创建多个 FileSystemSyncAccessHandle 实例,只要所有实例均处于只读模式即可。
  • "readwrite-unsafe":允许多个写入器。打开后,系统会允许使用 FileSystemSyncAccessHandle 上的任何方法。可以创建多个 FileSystemSyncAccessHandle 实例,前提是所有实例都处于非读写不安全模式。

通过将 "readwrite" 选项保留为默认选项(一次只允许一个实例),可以保留当前行为。如果网站需要打开多个 FileSystemSyncAccessHandle 对象但不需要执行写入,则应使用 "read-only" 选项。最后一个选项 "readwrite-unsafe" 允许多个实例,同时支持读取和写入。在这种情况下,如果从多个标签页执行写入,可能会出现争用问题,并且网站需要提供自己的锁定方案。

const handle1 = await handle.createSyncAccessHandle({mode: 'readwrite-unsafe'});
// This will succeed:
const handle2 = await handle.createSyncAccessHandle({mode: 'readwrite-unsafe'});

FileSystemWritableFileStream 的独占写入器

FileSystemSyncAccessHandle 不同,现在,每个文件条目可以创建多个 FileSystemWritableFileStream 实例。我们缺少的是为专享作者提供选项的方法。Chrome 121 向 FileSystemAccessFileHandle.createWritable() 方法添加了一个可选的 mode 参数,该参数具有以下值:

  • "exclusive" 模式:一次只能有一个写入者。
  • "siloed" 模式:这是当前的默认模式。每个创建的写入器都将有自己的交换文件。
const writable1 = await handle.createWritable({mode: 'exclusive'});
// This will fail:
const writable2 = await handle.createWritable();

浏览器支持

从 Chrome 121 开始,系统支持 FileSystemSyncAccessHandle 的多个读取器和写入器,以及 FileSystemWritableFileStream 的独占写入器这两项功能。

进入开发者试用阶段

如需在 Chrome 121 发布之前加入开发者试用计划以测试此功能,请将 chrome://flags 中的 #file-system-access-locking-scheme 标志设为 Enabled。这样,您就可以在本地机器上测试该功能。

致谢

本文由 Daseul LeeNathan MemmottRachel Andrew 审核。