Как найти и открыть файл в надстройке Visual Studio 2005? - PullRequest
0 голосов
/ 07 мая 2010

Я создаю надстройку с Visual Studio 2005 C #, которая помогает легко переключаться между исходными файлами и файлами заголовков, а также файлами сценариев, которые имеют одинаковую структуру имен. Однако в структуре каталогов все файлы находятся в разных местах, даже если они находятся в одном проекте.

У меня есть почти все компоненты, но я не могу понять, как найти и открыть файл в решении, основываясь только на одном имени файла. Итак, я знаю, что я, скажем, из c: \ code \ project \ subproject \ src \ blah.cpp, и я хочу открыть c: \ code \ project \ subproject \ inc \ blah.h, но я не Не обязательно знать, где бла. Я мог бы жестко закодировать разные пути к каталогам, но тогда утилита не достаточно универсальна, чтобы быть надежной.

Решение имеет несколько проектов, что также кажется немного болезненным. В данный момент я думаю, что мне придется перебирать каждый проект, перебирать каждый элемент проекта, чтобы увидеть, есть ли конкретный файл, и затем получить правильную ссылку на него.

Но мне кажется, должен быть более простой способ сделать это.

1 Ответ

1 голос
/ 07 мая 2010

Чтобы работать в общем для файловой структуры любого пользователя, вам нужно перечислить все файлы во всех проектах. Это должно начать вас. И, ну, в значительной степени закончил: -)

    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);
    }

Обратите внимание, что заголовок может находиться в пути включения без добавления в проект, поэтому, если вышеперечисленное не удастся, вы также можете посмотреть пути включения для содержащего проекта. Я оставлю это как упражнение для читателя.

...