重大变更: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 */