浏览器可通过file system access api安全修改本地文件,需用户授权且仅chromium系支持;firefox/safari不支持,须https环境,读写需句柄,目录操作需directorypicker,兼容性差需降级方案。

浏览器现在真能直接改你电脑上的文件了,但不是随便就能写——得用户亲手点选、明确授权,而且只在 Chromium 系统(Chrome、Edge、Opera)里稳定可用。Firefox 和 Safari 还不支持,这点必须提前心里有数。
怎么打开并修改已有文件
关键在于“句柄”——它不是文件本身,而是用户授权后给你的一把临时钥匙。流程很直白:
- 用 window.showOpenFilePicker() 弹出系统选择框,用户挑好文件,返回一个 FileSystemFileHandle
- 调 fileHandle.getFile() 获取实际 File 对象,再用 .text() 或 .arrayBuffer() 读内容
- 编辑完后,调 fileHandle.createWritable() 得到可写流,write() 写入新数据,最后别忘了 close()
注意:写操作必须在用户点击等手势触发的上下文中执行,不能 onload 自动跑;刷新页面后句柄失效,想持久化得靠 IndexedDB 存句柄(需用户再次授权才能复用)。
怎么另存为新文件或覆盖原文件
保存动作分两种场景:
-
另存为:用 window.showSaveFilePicker(),传 suggestedName 和 types(比如
{ 'text/plain': ['.txt'] }),用户选路径后直接写 - 覆盖原文件:不用重新 pick,直接复用之前拿到的 fileHandle 调 createWritable() 即可,系统不会二次确认
如果用户中途拒绝权限(比如点了“取消”),会抛 NotAllowedError,这时可以捕获异常,再弹一次 showSaveFilePicker 引导重试。
目录操作与批量处理
想遍历文件夹、批量读写,就得用 window.showDirectoryPicker():
- 返回的是 FileSystemDirectoryHandle,它没有直接读写能力,但能调 values() 迭代子项
- 每个子项可能是文件或子目录,判断 entry.kind === 'file' 后,再用 entry.getFile() 拿内容
- 对目录内文件写入,仍需先获取对应 FileSystemFileHandle,再走 createWritable 流程
目录句柄也能存起来复用,但同样依赖用户授权记忆机制,跨域或隐私模式下不生效。
兼容性兜底与实际限制
这 API 很强大,但现实约束不少:
- 仅限 HTTPS 或 localhost,HTTP 站点完全不可用
- Firefox 和 Safari 无计划支持(截至 2026 年 6 月),必须准备降级方案,比如 fallback 到 Blob + a 标签下载
- 不能访问系统敏感路径(如 C:\Windows),也不能绕过用户选择直接写任意位置
- 二进制文件(图片、PDF)同样适用,读写时用 arrayBuffer() 和 Uint8Array 更稳妥
真正落地时,建议把核心逻辑封装成可复用函数,同时内置 try/catch 和降级分支,避免功能断裂。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











