如何在EnvDTE80.SolutionFolder中无需指定绝对路径创建新文件?
在SolutionFolder中直接创建新文件的简便方法
这个问题我之前也碰到过!EnvDTE80.SolutionFolder的设计确实有点反直觉——明明是用来管理文件夹的,却不直接暴露自身的磁盘路径,想要创建新文件还得先自己拼绝对路径。不过好在有个靠谱的解决方案,我们可以通过扩展方法封装成你期望的简洁调用方式,不用手动拼接路径。
核心思路
SolutionFolder本质上是一个特殊的Project对象,它关联的ProjectItem属性会包含该文件夹在磁盘上的绝对路径。我们可以利用这个属性拿到路径,然后创建文件再添加到SolutionFolder中。
实现代码
下面是封装好的扩展方法,直接就能用:
using System; using System.IO; using EnvDTE; using EnvDTE80; public static class SolutionFolderExtensions { public static ProjectItem CreateFile(this SolutionFolder solutionFolder, string fileName) { // 校验输入参数 if (solutionFolder == null) throw new ArgumentNullException(nameof(solutionFolder)); if (string.IsNullOrWhiteSpace(fileName)) throw new ArgumentException("文件名不能为空", nameof(fileName)); // 获取SolutionFolder对应的磁盘文件夹路径 var folderDiskPath = solutionFolder.ProjectItem.FileNames[1]; // 拼接新文件的完整绝对路径 var fullFilePath = Path.Combine(folderDiskPath, fileName); // 创建新文件(这里默认创建空文件,需要初始内容可以替换成File.WriteAllText) if (!File.Exists(fullFilePath)) { // 创建后立即释放文件句柄 using (File.Create(fullFilePath)) {} } // 将新文件添加到SolutionFolder并返回对应的ProjectItem return solutionFolder.AddFromFile(fullFilePath); } }
使用方式
现在你就能像最开始期望的那样调用了:
EnvDTE80.SolutionFolder folder; var newFileItem = folder.CreateFile("myFile.txt");
注意事项
- 这个方法适用于对应磁盘实际文件夹的SolutionFolder,如果是纯虚拟的SolutionFolder(不关联磁盘路径),
ProjectItem.FileNames[1]可能会为空,这种场景需要特殊处理。 - 代码中加入了文件存在判断,避免覆盖现有文件;如果需要覆盖,可以去掉
if (!File.Exists(fullFilePath))判断。 - 如果需要给新文件写入初始内容,可以把
File.Create替换成File.WriteAllText(fullFilePath, "你的初始内容")。
内容的提问来源于stack exchange,提问作者TWT
相关产品推荐
相关产品推荐

