VSCode扩展开发:无可用工作区文件夹时如何打开自定义文件?
无工作区场景解决方案
你可以通过两种路径适配未打开文件夹的场景:
- 方案1:弹出系统保存对话框,由用户指定文件保存路径
不管当前是否打开工作区,都可以调用vscode.window.showSaveDialog接口让用户选择存储位置,兼容性最强,也符合用户直觉。 - 方案2:创建无标题(Untitled)内存文件
如果不需要强制用户先落地文件到磁盘,可以直接创建VSCode内置的内存虚拟文件,不需要真实路径即可打开编辑,用户后续可以手动选择保存位置。
关于vscode.openWith传参说明
vscode.openWith不支持直接传入文件内容,只能接收URI作为打开目标,但你可以通过无标题URI或者**自定义虚拟文件系统(FileSystemProvider)**来实现不需要本地磁盘路径的打开效果。
适配全场景的代码示例
let disposable = vscode.commands.registerCommand('myextension.add-new-file', async () => { let fileUri: vscode.Uri; // 存在工作区的情况,沿用你原来的自动生成路径逻辑 if(vscode.workspace.workspaceFolders?.length){ const rootPath = vscode.workspace.workspaceFolders[0].uri.fsPath ; let counter = 0; let filePath = ''; do{ counter++; filePath = path.join(rootPath, `NewFile${counter}.my-ext`); }while(fs.existsSync(filePath)); fs.writeFileSync(filePath, JSON.stringify(newFileContent), 'utf8'); fileUri = vscode.Uri.file(filePath); } else { // 无工作区的情况:这里可以二选一 // 选项A:弹出保存对话框让用户选位置 const saveUri = await vscode.window.showSaveDialog({ defaultUri: vscode.Uri.file(`NewFile1.my-ext`), filters: { '自定义格式': ['my-ext'] } }); if (!saveUri) return; // 用户取消了保存操作 fs.writeFileSync(saveUri.fsPath, JSON.stringify(newFileContent), 'utf8'); fileUri = saveUri; // 选项B:创建无标题内存文件,不需要落地磁盘 // fileUri = vscode.Uri.parse(`untitled:NewFile1.my-ext`); // const edit = new vscode.WorkspaceEdit(); // edit.insert(fileUri, new vscode.Position(0, 0), JSON.stringify(newFileContent)); // await vscode.workspace.applyEdit(edit); } // 用自定义编辑器打开 vscode.commands.executeCommand('vscode.openWith', fileUri, 'myextension.custom-designer'); });
内容的提问来源于stack exchange,提问作者sovo2014
相关产品推荐
相关产品推荐

