如何获取项目下的文件夹
本文关键字:项目 文件夹 获取 何获取 | 更新日期: 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.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。善良而不是投射物,善良。关于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;
}