源私有文件系统提供对一种针对性能进行了高度优化的特殊文件的访问权限,例如,通过提供对文件内容的原位和独占写入权限。开发者可以通过调用 createSyncAccessHandle()
(这是 FileSystemFileHandle
对象上公开的方法)来访问此类文件。此调用会产生 FileSystemSyncAccessHandle
。
FileSystemSyncAccessHandle
是一种文件基元,可高效访问本地文件。其主要用例之一是将 C/C++ 代码移植到 Wasm 的应用;不过,Wasm 尚不完全支持异步调用,而使用 Asyncify 库作为替代方案会大幅降低性能。使 FileSystemSyncAccessHandle
的所有方法都同步,以符合基于 Wasm 的应用预期的同步 POSIX 文件 API;使 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();
我需要做什么?
请注意,将方法从异步更改为同步是一种 Web 公开更改,可能会导致中断。虽然在同步方法中使用 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 */
相关链接
- TAG 审核
- 规格
- 规范问题(导致了更改)
- ChromeStatus 条目
- Chromium bug