2010-05-07 6 views
0

Je crée un complément avec Visual Studio 2005 C# pour faciliter le basculement entre les fichiers source et en-tête, ainsi que les fichiers de script qui suivent une structure de nommage similaire. Cependant, la structure du répertoire contient tous les fichiers à différents endroits, même s'ils sont tous dans le même projet. J'ai presque toutes les pièces en place, mais je ne peux pas trouver comment trouver et ouvrir un fichier dans la solution basée uniquement sur le nom de fichier seul. Donc, je sais que je viens de, disons, c: \ code \ projet \ sous-projet \ src \ blah.cpp, et je veux ouvrir c: \ code \ projet \ sous-projet \ inc \ blah.h, mais je ne ' Je ne sais pas nécessairement où est blah.h. Je pourrais coder en dur différents chemins de répertoire, mais l'utilitaire n'est pas assez générique pour être robuste.Comment rechercher et ouvrir un fichier dans un complément Visual Studio 2005?

La solution a plusieurs projets, ce qui semble être un peu pénible. Je pense à ce stade que je devrai itérer à travers chaque projet, et itérer à travers chaque élément du projet, pour voir si le fichier particulier est là, et ensuite obtenir une référence appropriée à celui-ci.

Mais il me semble qu'il doit y avoir un moyen plus simple de le faire.

Répondre

1

Pour fonctionner de manière générique pour la structure de fichier de n'importe quel utilisateur, vous devez énumérer tous les fichiers de tous les projets. Cela devrait vous aider à démarrer. Et, bien, assez bien fini :-)

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

Notez qu'il est possible pour un en-tête soit dans le chemin d'inclusion sans être ajouté au projet, donc en cas d'échec ci-dessus, vous pouvez regarder potentiellement dans la inclure des chemins pour le projet contenant aussi. Je vais laisser cela comme un exercice pour le lecteur.

Questions connexes