针对在浏览器中处理文件的 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 标志设置为已启用。这样,您就可以在计算机本地测试该功能。

致谢

本文由 Daseul LeeNathan MemmottRachel Andrew 审核。