來源私人檔案系統提供存取經過高度最佳化處理的特殊檔案類型,例如,提供檔案內容就地的專屬寫入存取權。開發人員只要呼叫 createSyncAccessHandle()
即可存取這些檔案,這是一種在 FileSystemFileHandle
物件上公開的方法。這項呼叫會產生 FileSystemSyncAccessHandle
。
FileSystemSyncAccessHandle
是檔案基元,可提供本機檔案的有效存取權。其中一個主要用途是將應用程式移植 C/C++ 程式碼至 Wasm;然而,Wasm 尚未完全支援非同步呼叫,使用 Asyncify 程式庫做為替代方案會大幅降低效能。讓 FileSystemSyncAccessHandle
同步的所有方法都符合同步、類似 POSIX 型檔案 API Wasm 型的應用程式預期:讓 API 更符合人性,同時大幅提升效能。
最新消息
FileSystemSyncAccessHandle
公開下列以往已非同步,但自 Chromium 108 起同步的方法。
truncate(newSize)
:將與存取帳號相關聯的檔案大小調整為newSize
個位元組。如果newSize
大於目前的檔案大小,會以空值截斷檔案;否則會截斷檔案。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 */
相關連結
- TAG 審查
- 規格
- 規格問題 (導致變化)
- ChromeStatus 項目
- Chromium 錯誤