代码改变世界

VS Addin开发小技巧:获取Solution Explorer中文件项的路径

2009-08-30 21:58 by Anders Cui, ... 阅读, ... 评论, 收藏, 编辑

在VS2008中,当我们打开一个文档时,在顶部的Tab上有几个实用的菜单项:

vs-document-context-menu

这里主要看其中的两项:Copy Full Path和Open Containing Folder,可以获取文档的路径或者打开包含当前文档的文件夹,尤其是后者,是经常会用到的。

不过在Solution Explorer中,却没有对应的菜单项,当你需要的时候,只好先打开文档,再使用上面的菜单。现在考虑如何在Addin中添加这两个缺失的菜单。

对于打开的文档,都会有一个Document类型的实例与之对应,通过它的FullName属性可以了解当前文档的完整路径,有了这个路径,上述菜单功能就容易实现了。

在Solution Explorer中,有些不同,对于其中的文件项,对应的是ProjectItem的实例,它倒是有个Document属性,不过如果文档没打开,那么这个属性就为null,对于我们此处的需求来说,Document就用不上了。仔细观察一下就会发现,ProjectItem有个Properties属性,而该集合属性有若干有用的信息,其中的FullPath正是我们需要的!接下来就好办了。

首先添加两个命令到文件项的上下文菜单:

C# Code - 添加命令
CommandBar projectItemCommandBar = helper.GetCommandBarByName("Item");

try
{
    helper.AddNamedCommand2(projectItemCommandBar, COPY_FULL_PATH_COMMAND_NAME,
        
"Copy Full Path""Copy Full Path"false0, projectItemCommandBar.Controls.Count + 1);

    helper.AddNamedCommand2(projectItemCommandBar, OPEN_CONTAINING_FOLDER_COMMAND_NAME,
        
"Open Containing Folder""Open Containing Folder"false0, projectItemCommandBar.Controls.Count + 1);
}
catch
{
}


对于Copy Full Path命令,可以这样实现:

C# Code - Copy Full Path Command
private void CopyFullPath()
{
    SelectedItems items 
= _applicationObject.SelectedItems;
    ProjectItem item 
= items.Item(1).ProjectItem;

    
string fullPath = item.Properties.Item("FullPath").Value.ToString();
    Clipboard.SetText(fullPath);
}


而对于Open Containing Folder也是类似:

C# Code - OpenContainingFolder Command
private void OpenContainingFolder()
{
    SelectedItems items 
= _applicationObject.SelectedItems;
    ProjectItem item 
= items.Item(1).ProjectItem;

    
string fullPath = item.Properties.Item("FullPath").Value.ToString();
    System.Diagnostics.Process.Start(
"explorer.exe",
        
string.Format("/select, \"{0}\"", fullPath));
}

 

除了这两个基本的命令,根据这个路径,我们还可以去做更多的事情。比如在最近的一个项目中,假设项目名称为MyProj,那么他们规定存放解决方案的目录必须MyProj,如D:\MyWorks\MyProj(也可以不这样,但那样会更麻烦),在此之后,会频繁使用到从MyProj开始的相对路径。如果手工去做,显然会浪费很多时间,通过上面的方法,完全可以获取文件路径,然后截取MyProj之后的部分,时间长了会节省很多时间。

看下来,这是一个相当简单的技巧,但是却很实用。当前很少有资料提到这个地方,而且它还隐藏在Properties这里面,这又是一个VS Addin API的一个不好的地方——不是通过简单的属性直接开放,而是堆放在一些集合属性中——这时必须要耐心地去查看集合的每一项才能知道是否有自己需要的东西。