重大变更:AccessHandles 的同步方法

源私有文件系统提供一种特殊类型的文件,这种文件经过高度优化,可提高性能,例如,通过提供对文件内容的就地和独占写入访问权限。开发者可以通过调用 createSyncAccessHandle()(这是针对 FileSystemFileHandle 对象公开的方法)来访问此类文件。此调用会产生 FileSystemSyncAccessHandle

FileSystemSyncAccessHandle 是一个文件基元,可提供对本地文件的高效访问。它的主要用例之一是应用将 C/C++ 代码移植到 Wasm;但是,Wasm 尚未完全支持异步调用,使用 Asyncify 库作为替代方案会大大降低性能。使 FileSystemSyncAccessHandle 的所有方法都同步符合类似于 POSIX 的同步文件 API 基于 Wasm 的应用预期;使该 API 更符合人体工程学,同时带来显著的性能提升。

新变化

FileSystemSyncAccessHandle 公开了以下方法,这些方法曾经是异步的,但从 Chromium 108 开始是同步的

  • truncate(newSize):将与访问句柄关联的文件的大小调整为 newSize 字节。如果 newSize 大于当前文件大小,则会在文件中填充 null 字节;否则会截断文件。
  • getSize():返回与访问句柄关联的文件的大小(以字节为单位)。
  • flush():确保与访问句柄关联的文件的内容包含通过 write() 完成的所有修改。
  • close():刷新访问手柄,然后关闭它。关闭访问句柄会停用对该访问句柄的任何进一步操作,并解锁与访问句柄关联的条目上的锁。
// In a `Worker`:
const root = await navigator.storage.getDirectory();
const fileHandle = await root.getFileHandle('test', { create: true });
// `createSyncAccessHandle()` is still async.
const accessHandle = await fileHandle.createSyncAccessHandle();
// Both `read()` and `write()` were sync before.
accessHandle.read(/* ... */);
accessHandle.write(/* ... */);

// New: synchronous as of Chromium 108.
console.log(accessHandle.getSize());
accessHandle.truncate(123);
accessHandle.flush();
accessHandle.close();

我需要做什么?

请注意,将方法从异步更改为同步是公开的更改,可能会造成破坏。虽然在同步方法中使用 await 是一项空操作,但任何使用 Promise.then() 都会中断。如果您对任何先前异步现在是同步方法的结果链接 then() 调用,则需要更改代码。

// (✅) This won't break, but you better remove the superfluous `await`:
await accessHandle.flush();
// ✅ Correct:
accessHandle.flush();
// ⛔️ This will break, and you need to restructure your code:
accessHandle.flush().then(/* Follow-up code */);
// ✅ Correct:
accessHandle.flush();
/* Follow-up code */