Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过TFS 2012 API锁定本地工作区下的文件_C#_Api_Tfs_Locking_Workspace - Fatal编程技术网

C# 如何通过TFS 2012 API锁定本地工作区下的文件

C# 如何通过TFS 2012 API锁定本地工作区下的文件,c#,api,tfs,locking,workspace,C#,Api,Tfs,Locking,Workspace,我正试图通过workspace.PendEdit以独占锁LockLevel.CheckOut签出单个文件。以下函数成功(无错误),但似乎对TFS中的文件没有影响(未签出且未锁定) 我怀疑这与我的TFS工作区是本地的有关。但是,Visual Studio 2015通过[源代码管理资源管理器]->[右键单击所选文件]->[高级]->[锁定]在文件上建立锁定似乎没有问题。我在做什么与VS所做的不同?我遗漏了什么吗?您应该使用RecursionType.Full而不是RecursionType.None

我正试图通过
workspace.PendEdit
以独占锁
LockLevel.CheckOut
签出单个文件。以下函数成功(无错误),但似乎对TFS中的文件没有影响(未签出且未锁定)


我怀疑这与我的TFS工作区是本地的有关。但是,Visual Studio 2015通过
[源代码管理资源管理器]->[右键单击所选文件]->[高级]->[锁定]
在文件上建立锁定似乎没有问题。我在做什么与VS所做的不同?我遗漏了什么吗?

您应该使用RecursionType.Full而不是RecursionType.None

workspace.PendEdit(new[] {filePath}, RecursionType.Full, null, LockLevel.CheckOut);
方法的作用是:返回为指定的文件路径签出/锁定的文件数。RecursionType.Full将递归到路径的最后一个子级

更新:
请尝试为API项目安装此TFS nuget package(),并测试此问题是否仍然存在。如果它有效,无论您使用的是什么版本的VS,都不会出现此问题

经过多次尝试和错误后,我最终实现了一个
noncatalError
的事件处理程序,如下所示:

private static void VersionControlServer_NonFatalError(object sender, ExceptionEventArgs e)
    {
        if (e.Failure != null && e.Failure.Severity == SeverityType.Error)
            throw new ApplicationException("An internal TFS error occurred. See failure message for details:\r\n"+e.Failure.Message);
    }
一旦事件处理程序通过
versionControlServer.noncatalError+=versionControlServer\u noncatalError连接到
versionControlServer
对象我可以看到我的独家退房发生了什么。事实证明,TFS正在无声地失败,出现以下错误:

TF400022: The item $/Fake/Server/Path/project.config cannot be locked for checkout in workspace MYWORKSPACE;Dan Lastname. Checkout locks are not supported in local workspaces.
解决方案是将
LockLevel
LockLevel.CheckOut
更改为
LockLevel.Checkin
。这是一种稍有不同的锁类型,但足以满足我的需要,这是VS在尝试在本地工作区中锁定文件时使用的锁类型。这是我的原始函数,它在
LockLevel
中做了微小的更改,这一切都有所不同

public static void Lock(string filePath)
{
    var workspace = GetWorkspace(filePath);
    workspace.PendEdit(new[] {filePath}, RecursionType.None, null, LockLevel.Checkin);
} 

这对TFS中的文件仍然没有任何影响-它保持未锁定且未签出(RecursionType设置对结果没有影响)@Dan尝试使用“int count=workspace.PendEdit(new[]{filePath},RecursionType.Full,null,LockLevel.CheckOut);”如果计数为0?确保“文件路径”下有文件项。文件路径是工作区的本地路径。计数为0。文件路径是正确的。PendEdit报告没有错误(至少我看不到任何错误)。@Dan你能在另一台机器上测试代码吗?如果计数仍然为0?在两个不同的工作站上尝试(设置方式与我的相同)-相同的事情(计数=0)
public static void Lock(string filePath)
{
    var workspace = GetWorkspace(filePath);
    workspace.PendEdit(new[] {filePath}, RecursionType.None, null, LockLevel.Checkin);
}