跳到主要内容

文件系统提供器和文本文档内容提供器用来做什么?

结论​

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 还指着已经失效的回调。