文件系统提供器和文本文档内容提供器用来做什么?
结论
FileSystemProvider 实现一整套可读写的自定义 scheme,编辑器会把它当成真实文件系统。TextDocumentContentProvider 只给某种 scheme 提供只读文本,适合预览和虚拟文档,不能写、不能列目录。
展开
文本文档内容提供器更轻:
vscode.workspace.registerTextDocumentContentProvider("myext-preview", {
onDidChange: emitter.event,
provideTextDocumentContent(uri) {
return render(uri);
}
});
然后 window.showTextDocument(Uri.parse("myext-preview:报告"))。内容变了就 emitter.fire(uri)。适合 diff 预览、解码后的只读视图、日志格式化。
文件系统提供器要实现 stat、readDirectory、readFile、writeFile、delete、rename、createDirectory 以及变更事件。资源管理器能浏览,编辑器能保存,workspace.fs 也能调用。适合把远程接口、压缩包、数据库映射成文件树。
选择:
- 只是打开一个不能保存的虚拟标签:内容提供器。
- 用户要在树上浏览、编辑并保存:文件系统提供器。
- 只是改已有文件:两个都不要,直接用
WorkspaceEdit。
自定义 scheme 要在贡献语言或文档选择器里写上,否则语言功能和图标可能不生效。记得处理 watch,不然资源管理器不会刷新。
容易讲错的点
- 内容提供器的 URI 没有磁盘文件,任何
fsPath假设都会坏。 - 文件系统提供器跑在扩展宿主里,
stat和readDirectory如果打远程接口,必须异步且尽快返回,否则资源管理器会卡。 - 两种提供器都要放进
subscriptions。漏了的话,重载插件后旧 scheme 还指着已经失效的回调。