我如何以编程方式检出项目以在TFS中进行编辑?

我正在使用TFS 2010处理在源代码控制下的实用程序处理文件。

如果一个项目还没有签出编辑,我得到一个exception,什么是绝对可预测的,因为文件处于只读模式。

有什么办法检出文件?

PS我想要的东西编程,而不是Process.Start("tf.exe", "..."); 如果这是适用的。

这里提到的其他一些方法只适用于特定版本的TFS或使用过时的方法。 如果您收到404,则您使用的方法可能与您的服务器版本不兼容。

这个方法在2005年,2008年和2010年都有效。我不再使用TFS,所以我没有testing2013年。

 var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(fileName); using (var server = new TfsTeamProjectCollection(workspaceInfo.ServerUri)) { var workspace = workspaceInfo.GetWorkspace(server); workspace.PendEdit(fileName); } 

您可以使用Team Foundation版本控制客户端API。 方法是PendEdit()

 workspace.PendEdit(fileName); 

在MSDN上查看详细的示例http://blogs.msdn.com/b/buckh/archive/2006/03/15/552288.aspx

 private const string tfsServer = @"http://tfsserver.org:8080/tfs"; public void CheckOutFromTFS(string fileName) { using (TfsTeamProjectCollection pc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(tfsServer))) { if (pc != null) { WorkspaceInfo workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(fileName); if (null != workspaceInfo) { Workspace workspace = workspaceInfo.GetWorkspace(pc); workspace.PendEdit(fileName); } } } FileInfo fi = new FileInfo(fileName); } 

请注意, Microsoft.TeamFoundation.Client.TeamFoundationServerFactory已过时: TeamFoundationServer类已过时。 使用TeamFoundationProjectCollectionTfsConfigurationServer类与2010 Team Foundation Server交谈。 为了与2005或2008 Team Foundation Server交谈,请使用TeamFoundationProjectCollection类。 相应的工厂类是TfsTeamProjectCollectionFactory

首先得到工作区

 var tfs = new TeamFoundationServer("http://server:8080/tfs/collection"); var version = (VersionControlServer)tfs.GetService(typeof(VersionControlServer)); var workspace = version.GetWorkspace("WORKSPACE-NAME", version.AuthorizedUser); 

在工作区中,您可以检出文件

 workspace.PendEdit(fileName); 
 var registerdCollection = RegisteredTfsConnections.GetProjectCollections().First(); var projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(registerdCollection); var versionControl = projectCollection.GetService<VersionControlServer>(); var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(_fileName); var server = new TeamFoundationServer(workspaceInfo.ServerUri.ToString()); var workspace = workspaceInfo.GetWorkspace(server); workspace.PendEdit(fileName); 

我有两种方法如何做到这一点:简单和先进。

1)。 简单:

  #region Check Out public bool CheckOut(string path) { using (TfsTeamProjectCollection pc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(ConstTfsServerUri))) { if (pc == null) return false; WorkspaceInfo workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(path); Workspace workspace = workspaceInfo?.GetWorkspace(pc); return workspace?.PendEdit(path, RecursionType.Full) == 1; } } public async Task<bool> CheckoutAsync(string path) { return await Task.Run(() => CheckOut(path)); } #endregion 

2)。 高级(具有接收状态):

  private static string GetOwnerDisplayName(PendingSet[] pending) { var result = pending.FirstOrDefault(pendingSet => pendingSet.Computer != Environment.MachineName) ?? pending[0]; return result.OwnerDisplayName; } private string CheckoutFileInternal(string[] wsFiles, string folder = null) { try { var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(folder); var server = new TfsTeamProjectCollection(workspaceInfo.ServerUri); var workspace = workspaceInfo.GetWorkspace(server); var request = new GetRequest(folder, RecursionType.Full, VersionSpec.Latest); GetStatus status = workspace.Get(request, GetOptions.None); int result = workspace.PendEdit(wsFiles, RecursionType.Full, null, LockLevel.None); if (result == wsFiles.Length) { //TODO: write info (succeed) to log here - messageText return null; } var pending = server.GetService<VersionControlServer>().QueryPendingSets(wsFiles, RecursionType.None, null, null); var messageText = "Failed to checkout !."; if (pending.Any()) { messageText = string.Format("{0}\nFile is locked by {1}", messageText, GetOwnerDisplayName(pending)); } //TODO: write error to log here - messageText return messageText; } catch (Exception ex) { UIHelper.Instance.RunOnUiThread(() => { MessageBox.Show(Application.Current.MainWindow, string.Format("Failed checking out TFS files : {0}", ex.Message), "Check-out from TFS", MessageBoxButton.OK, MessageBoxImage.Error); }); return null; } } public async Task<string> CheckoutFileInternalAsync(string[] wsFiles, string folder) { return await Task.Run(() => CheckoutFileInternal(wsFiles, folder)); }