Как достать папки по проектам?

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

DTE2 dte2;
dte2=(DTE2)System.Runtime.InteropServices.Marshal.
GetActiveObject("VisualStudio.DTE.10.0");
Projects projects = dte2.Solution.Projects;

Затем я перебираю элементы проекта и получаю "вид" элемента. Но он показывает только GUID. Мне нужно знать, является ли элемент папкой. Как я могу это сделать?

Ref:

var item = projects.GetEnumerator();
while (item.MoveNext())
{
  var project = item.Current as Project;
  for(i=1;i<project.ProjectItems.Count;i++)
  {
     string itemType = project.ProjectItems.Item(i).Kind;
  }
}

РЕДАКТИРОВАТЬ:

В настоящее время я использую обходной путь:

string location = project.ProjectItems.Item(i).get_FileNames(1);
if (location.EndsWith(@"\"))
        {
            // It is a folder E.g C:\\Abc\\Xyz\\
        }

3 ответа

Вы могли бы использовать EnvDTE.Constants.vsProjectItemKindPhysicalFolder сравнить ProjectItem.Kind собственность против.

Дополнительные константы можно найти здесь: http://msdn.microsoft.com/library/vstudio/envdte.constants

Ты можешь использовать ProjectKinds.vsProjectKindSolutionFolder чтобы увидеть, является ли проект папкой или нет.

например

var item = projects.GetEnumerator();
while (item.MoveNext())
{
  var project = item.Current as Project;
  for(i=1;i<project.ProjectItems.Count;i++)
  {
     string itemType = project.ProjectItems.Item(i).Kind;
     if (itemType  == ProjectKinds.vsProjectKindSolutionFolder)
     {
         // Do whatever
     }
  }
}

РЕДАКТИРОВАТЬ: Как уже упоминалось в моем комментарии, я понял после публикации, что выше это для SolutionFolders, которые являются Project.Kind, а не ProjectItem.Kind. Что касается ГУИДОВ, Microsoft говорит:

Свойство Kind Project или ProjectItem не возвращает значение перечисления (поскольку.NET должен учитывать типы проектов, предоставленные сторонними организациями). Итак, свойство Kind возвращает уникальную строку GUID для идентификации типа. Модель расширяемости предоставляет некоторые из этих GUID, разбросанных по нескольким сборкам и классам (EnvDTE.Constants, VSLangProj.PrjKind, VSLangProj2.PrjKind2 и т. Д.), Но иногда вам придется угадывать значения и жестко их кодировать.

С http://support.microsoft.com/kb/555561. Как я уже сказал в комментарии, мы надеемся, что GUID для ProjectItem of the вида "папка" одинаков во всех аспектах. Вам просто нужно определить этот GUID и жестко закодировать его.

Вот способ рекурсивно получить все папки как ProjectItem из проекта.

Вы должны использовать EnvDTE.Constants.vsProjectItemKindPhysicalFolder для ProjectItem.Kind для папок проекта, а не для папок решений, как упоминалось в других ответах.

      public static List<ProjectItem> GetProjectFolders(EnvDTE.Project project)
{
    var projectFolders = new List<ProjectItem>();

    foreach (ProjectItem projectItem in project.ProjectItems)
    {
        projectFolders.AddRange(GetFolderFromProjectItem(project, projectItem));
    }

    return projectFolders;
}

private static List<ProjectItem> GetFolderFromProjectItem(EnvDTE.Project project, ProjectItem projectItem)
{
     var projectFolders = new List<ProjectItem>();

     if (projectItem.Kind == EnvDTE.Constants.vsProjectItemKindPhysicalFolder)
     {
          projectFolders.Add(projectItem);

          foreach (ProjectItem subProjectItem in projectItem.ProjectItems)
          {
               projectFolders.AddRange(GetFolderFromProjectItem(project, subProjectItem));
          }
     }

     return projectFoldersRelativePaths;
}
Другие вопросы по тегам