Azure DevOps Server 2022 TFVC:如何用C#检查文件是否签出?
TFVC文件签出状态检查问题解决
问题根源
TfvcItem.IsPendingChange 属性仅用于标记当前TfvcItem是否属于未提交的挂起变更,而你通过GetItemAsync获取的是Azure DevOps Server上已提交的文件版本,这类服务器端的文件本身不存在未提交变更,所以该属性始终返回false是正常行为。
正确实现方式
要通过TfvcItem关联判断文件是否签出,需要先获取目标文件的挂起变更记录,从挂起变更中提取的TfvcItem才会正确返回IsPendingChange = true。以下是两种场景的代码示例:
1. 检查当前用户是否签出文件
// 获取当前用户针对目标文件的挂起变更 var pendingChanges = sourceControl.GetPendingChangesAsync(sSrcPath, RecursionType.None).Result; bool isCheckedOutByMe = pendingChanges.Any(); // 若存在签出,获取对应的TfvcItem并验证IsPendingChange if (isCheckedOutByMe) { TfvcItem checkedOutItem = pendingChanges.First().Item; bool isPending = checkedOutItem.IsPendingChange; // 此处会返回true }
2. 检查所有用户是否签出文件
如果需要确认文件是否被任意用户签出,可使用重载方法指定获取所有用户的挂起变更:
// 获取所有用户针对目标文件的挂起变更 var allPendingChanges = sourceControl.GetPendingChangesAsync( sSrcPath, RecursionType.None, workspaceName: null, // null表示所有工作区 userName: null, // null表示所有用户 pendingChangeTypes: null ).Result; bool isCheckedOutByAnyone = allPendingChanges.Any();
与旧代码的关联
你之前使用的GetPendingSets方法是获取用户的挂起变更集(包含多个文件的变更),而GetPendingChangesAsync更直接针对单个文件的挂起变更记录,两者本质都是查询未提交的变更,只是粒度不同。
内容的提问来源于stack exchange,提问作者user24917983
相关产品推荐
相关产品推荐

