访问TFS时“没有工作文件夹映射”错误

时间:2014-05-14 14:28:10

标签: c# tfs

我正在开发一个可以为TFS创建和添加项目的应用程序。

我的文件是在正确的位置正确创建的,但Workspace.PendAdd方法仅适用于一个特定的工作空间,其他工作空间给我"没有工作文件夹映射"错误。

我正在使用的方法是PendAdd(string filepath, bool recursive)所以我传入了一个要添加的目录,并期望将目录及其文件作为TFS中的挂起添加进行添加。

两个工作区在除名称之外的所有工作区中都是相同的,当前没有任何文件已检出,也不包含任何文件。

从我的谷歌搜索中我发现将文件添加到映射到$/的工作区时可能会出现问题,但我正在使用的工作区已映射到$/TFSFiles/,到目前为止似乎没有其他可能

我的PendAdd方法的代码是:

 private IEnumerable<PendingChange> PendAddFileToTfs(string newFilename)
      {
         var previousPendingChanges = new List<PendingChange>(_selectedWorkspace.GetPendingChanges());

         var changesAdded = _selectedWorkspace.PendAdd(Path.GetDirectoryName(newFilename), true);

         var pendingAdds = new List<PendingChange>(_selectedWorkspace.GetPendingChanges());

         var itemsToCheckIn = pendingAdds.Except(previousPendingChanges);

         return itemsToCheckIn;
      }

该方法在_selectedWorkspace.PendAdd行失败。我调试并验证它是正确的本地路径和正确的工作区。

有人能指出我在正确的方向吗?

编辑:

_selectedWorkspace变量由用户设置。

我通过以下代码获得所有可用工作空间的列表:

_workspaces = _versionControl.QueryWorkspaces(null, _versionControl.AuthorizedUser,environment.MachineName);

然后我在组合框中显示工作区列表,并允许用户选择一个。

这称为此方法:

 public void SetWorkspace(string workspaceName)
      {
         _selectedWorkspace = _workspaces.FirstOrDefault(ws => ws.Name.Equals(workspaceName));
      }

1 个答案:

答案 0 :(得分:2)

您需要先创建一个本地工作区,然后才能将pendAdd文件添加到TFS。我不确定_selectedWorkspace来自哪里,但它看起来没有正确配置。虽然我手头没有c#版本,但我确实在PowerShell中有一个调用c#的版本...应该给你一条路。

function New-TfsTeamProjectRootFolder {
    Param(
        [Microsoft.TeamFoundation.Client.TfsTeamProjectCollection] $TfsCollection,
        [Microsoft.TeamFoundation.Server.ProjectInfo] $TfsTeamProject,
        [String] $GlobalEntryValue
    )
    $TempWorkspaceName = "Create-TfsTeamSourceFolder"
    $TempFolder = "c:\temp\$TempWorkspaceName"
    $ServerFolder = "$/$($TfsTeamProject.Name)"
    $TfsVersionControl = Get-TfsVersionControlServer $TfsCollection
    try {
        $workspace = $TfsVersionControl.GetWorkspace($TempFolder )
    } catch {
        $workspace = $TfsVersionControl.CreateWorkspace($TempWorkspaceName);
        $workspace.Map($ServerFolder, $TempFolder); 
    }
    $NewFolder = "$TempFolder\$GlobalEntryValue";
    try {
        $SourceItem = $TfsVersionControl.GetItem("$ServerFolder/$GlobalEntryValue")
    } catch {
        New-Item -ItemType Directory -Force -Path $NewFolder;
        $workspace.PendAdd($NewFolder, $true); 
        $pendingChanges = $workspace.GetPendingChanges(); 
        $changesetNumber = $workspace.CheckIn($pendingChanges, "Added folder for '$GlobalEntryValue'"); 
        $SourceItem = $TfsVersionControl.GetItem("$ServerFolder/$GlobalEntryValue")
    }
    $workspace.Delete()
    Return $SourceItem
}

我再次不确定为什么你的代码没有工作,因为我认为这个问题比我们在上面的例子中看到的更大。