C#调用TFS API仅获取一级文件夹问题求助
嘿,我来帮你搞定这个TFS API的问题!你现在能成功连上TFS,但只能获取一级文件夹,要拿到四级子目录里的工作项,有两个实用的解决思路,我给你一步步说清楚:
首先先补全你给出的代码片段,方便后续理解:
string collectionUri = ConfigurationManager.AppSettings["tfsPath"].ToString();//http://myserver:8080/tfs/defaultcollection string teamProjectName = ConfigurationManager.AppSettings["tfsProject"].ToString(); TfsTeamProjectCollection tfsCollection = new TfsTeamProjectCollection(new Uri(collectionUri)); tfsCollection.EnsureAuthenticated(); WorkItemStore workItemStore = tfsCollection.GetService<WorkItemStore>(); Project teamProject = workItemStore.Projects[teamProjectName]; // 当前只能拿到一级文件夹 var rootFolders = teamProject.QueryHierarchy.OfType<Folder>();
方法1:递归遍历所有文件夹找到目标目录
TFS的Folder对象自带Children属性,里面包含了它的所有子节点(不管是子文件夹还是查询)。我们可以写一个递归方法,层层遍历文件夹,直到定位到你的四级目标目录,再获取里面的工作项。
代码示例
// 递归查找目标文件夹的方法 private static Folder FindTargetFolder(Folder parentFolder, string targetFolderPath) { // 检查当前文件夹路径是否匹配目标路径(可根据实际格式调整匹配逻辑) if (parentFolder.Path.Equals(targetFolderPath, StringComparison.OrdinalIgnoreCase)) { return parentFolder; } // 遍历当前文件夹的所有子文件夹,继续递归查找 foreach (var childFolder in parentFolder.Children.OfType<Folder>()) { var foundFolder = FindTargetFolder(childFolder, targetFolderPath); if (foundFolder != null) { return foundFolder; } } return null; } // 调用示例 // 替换成你的四级目录完整路径,格式一般是「团队项目名\文件夹1\文件夹2\文件夹3\目标文件夹」 string targetFolderFullPath = $@"{teamProjectName}\Level1\Level2\Level3\TargetFolder"; Folder targetFolder = null; // 从所有根文件夹开始遍历查找 foreach (var rootFolder in teamProject.QueryHierarchy.OfType<Folder>()) { targetFolder = FindTargetFolder(rootFolder, targetFolderFullPath); if (targetFolder != null) { break; } } if (targetFolder != null) { // 获取目标文件夹下的所有查询定义 var queries = targetFolder.Children.OfType<QueryDefinition>(); foreach (var query in queries) { // 执行查询拿到工作项集合 WorkItemCollection workItems = workItemStore.Query(query.QueryText); // 处理工作项 foreach (WorkItem item in workItems) { Console.WriteLine($"工作项ID: {item.Id}, 标题: {item.Title}"); } } }
方法2:直接用WIQL查询定位目标路径的工作项
如果你的核心需求是拿到目标路径下的所有工作项,不需要遍历文件夹结构,那直接用WIQL(工作项查询语言)会更高效。WIQL支持Under Path子句,可以直接指定工作项所在的文件夹路径,不管它在第几层。
代码示例
// 替换成你的四级目录完整路径 string targetFolderFullPath = $@"{teamProjectName}\Level1\Level2\Level3\TargetFolder"; // 构造WIQL查询语句,按需调整要获取的字段 string wiqlQuery = $@" SELECT [System.Id], [System.Title], [System.State], [System.AssignedTo] FROM WorkItems WHERE [System.TeamProject] = '{teamProjectName}' AND Under Path '{targetFolderFullPath}' ORDER BY [System.Id]"; // 执行查询获取工作项集合 WorkItemCollection workItems = workItemStore.Query(wiqlQuery); // 遍历处理工作项 foreach (WorkItem item in workItems) { Console.WriteLine($"ID: {item.Id}, 标题: {item.Title}, 状态: {item.State}, 负责人: {item.Fields["System.AssignedTo"].Value}"); }
小提示
- 确保
targetFolderFullPath的格式正确,TFS的文件夹路径区分大小写吗?视服务器配置而定,建议用StringComparison.OrdinalIgnoreCase来做匹配 - 如果你的TFS版本是2017及以后,也可以考虑用REST API来实现,但你当前用的传统客户端API,上面的方法完全适用
- 别忘了确认你的账号有访问目标文件夹和工作项的权限,避免出现空结果的情况
内容的提问来源于stack exchange,提问作者Sandeep Thomas
相关产品推荐
相关产品推荐

