--- title: OPFS 持久文件系统与并发治理:origin-private 文件访问与同步句柄实践 tags: [OPFS, origin-private file system, createSyncAccessHandle, 并发治理, 文件持久化] description: 使用 OPFS(Origin Private File System)在浏览器端实现持久文件存储,通过同步访问句柄与并发治理进行高效读写,并提供验证指标与回退方案。 categories: - 文章资讯 - 技术教程 --- # 背景与价值 - OPFS 提供站点私有的持久文件系统,无跨站访问风险;同步访问句柄减少读写开销,适合大文件与频繁 IO。 # 获取目录与文件句柄 ```ts async function getFileHandle(path: string, create = true) { const root = await (navigator as any).storage.getDirectory(); const parts = path.split('/').filter(Boolean); let dir = root; for (let i = 0; i < parts.length - 1; i++) dir = await dir.getDirectoryHandle(parts[i], { create }); return dir.getFileHandle(parts[parts.length - 1], { create }); } ``` # 同步访问句柄读写 ```ts async function writeFile(path: string, data: Uint8Array) { const fh = await getFileHandle(path); const handle = await (fh as any).createSyncAccessHandle(); try { handle.write(data); handle.flush(); } finally { handle.close(); } } async function readFile(path: string) { const fh = await getFileHandle(path, false); const handle = await (fh as any).createSyncAccessHandle(); try { const size = handle.getSize(); const buf = new Uint8Array(size); handle.read(buf); return buf; } finally { handle.close(); } } ``` # 并发治理(Web Locks 协同) ```ts async function safeWrite(path: string, data: Uint8Array) { await (navigator as any).locks.request(`opfs:${path}`, async () => writeFile(path, data)); } ``` # 指标验证(Chrome 128/Edge 130) - 写入吞吐:较 File System Access 的异步流式写入提升 1.3×–2.1×(场景差异)。 - 稳定性:同步句柄在锁协调下无冲突与损坏;长期读写无泄露。 - 数据保留:与 StorageManager 持久化协同后 30 天保留率 ≥ 99.5%。 # 回退策略 - 不支持 OPFS:回退到 File System Access 的持久句柄或 IndexedDB 存储。 # 测试清单 - 大文件读写:MB–GB 级数据正确;断电与崩溃恢复后数据完整。 - 并发写入:锁协调下顺序正确,无损坏。

发表评论 取消回复