2010-05-07 4 views
0

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

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

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

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

ответ

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

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

Смежные вопросы