支持 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 Lee、Nathan Memmott 和 Rachel Andrew 审核。