如何在Visual Studio 2005加载项中查找和打开文件?

时间:2010-05-07 19:28:05

标签: c# visual-studio-2005 add-in envdte

我正在使用Visual Studio 2005 C#创建一个加载项,以帮助轻松切换源文件和头文件,以及所有遵循类似命名结构的脚本文件。但是,目录结构将所有文件放在不同的位置,即使它们都在同一个项目中。

我已经有了几乎所有的部分,但我无法弄清楚如何仅根据文件名找到并打开解决方案中的文件。所以我知道我来自c:\ code \ project \ subproject \ src \ blah.cpp,我想打开c:\ code \ project \ subproject \ inc \ blah.h,但我不知道我一定知道blah.h在哪里。我可以硬编码不同的目录路径,但实用程序不够通用,不够健壮。

该解决方案有多个项目,这似乎也有点痛苦。我正在考虑在这一点上,我将不得不遍历每个项目,并遍历每个项目项,以查看特定文件是否存在,然后获得对它的正确引用。

但在我看来,必须有一种更简单的方法。

1 个答案:

答案 0 :(得分:1)

要一般地处理任何用户的文件结构,您需要枚举所有项目中的所有文件。这应该让你开始。而且,差不多完成了: - )

    internal static string GetSourceOrInclude(bool openAndActivate)
    {
        // Look in the project for a file of the same name with the opposing extension
        ProjectItem thisItem = Commands.Application.ActiveDocument.ProjectItem;
        string ext = Path.GetExtension(thisItem.Name);
        string searchExt = string.Empty;
        if (ext == ".cpp" || ext == ".c")
            searchExt = ".h";
        else if (ext == ".h" || ext == ".hpp")
            searchExt = ".cpp";
        else
            return(string.Empty);

        string searchItemName = thisItem.Name;
        searchItemName = Path.ChangeExtension(searchItemName, searchExt);

        Project proj = thisItem.ContainingProject;
        foreach(ProjectItem item in proj.ProjectItems)
        {
            ProjectItem foundItem = FindChildProjectItem(item, searchItemName);
            if (foundItem != null)
            {
                if (openAndActivate)
                {
                    if (!foundItem.get_IsOpen(Constants.vsViewKindCode))
                    {
                        Window w = foundItem.Open(Constants.vsViewKindCode);
                        w.Visible = true;
                        w.Activate();
                    }
                    else
                    {
                        foundItem.Document.Activate();
                    }
                }

                return(foundItem.Document.FullName);
            }

        return(string.Empty);
    }

请注意,标题可以在包含路径中而不添加到项目中,因此如果上述操作失败,您也可能会查看包含项目的包含路径。我将把它作为读者的练习。