如何获取项目下的文件夹

本文关键字:项目 文件夹 获取 何获取 | 更新日期: 2023-09-27 17:51:14

我试图得到它下面的项目和文件夹的列表。我可以使用以下命令获取项目和项目项:

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

然后,我遍历项目项并获得项目的"类型"。但是它只显示GUID。我需要知道这个项目是否是一个文件夹。我怎么做呢?

裁判:

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''
        }

如何获取项目下的文件夹

您可以使用EnvDTE.Constants.vsProjectItemKindPhysicalFolderProjectItem.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。善良而不是投射物,善良。关于GUIDS,微软说:

Project或projitem的Kind属性不返回枚举值(因为。net必须容纳第三方提供的项目类型)。因此,Kind属性返回一个唯一的GUID字符串来标识类型。可扩展性模型提供了一些分散在几个程序集和类(EnvDTE)中的guid。常数,VSLangProj。PrjKind VSLangProj2。PrjKind2等),但有时你必须猜测值并硬编码它们。
从http://support.microsoft.com/kb/555561

。正如我在评论中所说的,希望"文件夹"类项目的GUID在所有情况下都是相同的。您只需要确定此GUID并对其进行硬编码。

这是一种递归地从项目中获得所有文件夹作为投影项的方法。

你必须对projtem使用envdte . constants . vsprojtemkindphysicalfolder。类型用于项目文件夹而不是解决方案文件夹,如其他答案所述。

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