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

C# 访问TFS时出现“没有工作文件夹映射”错误,c#,tfs,C#,Tfs,我正在开发一个可以创建项目并将其添加到TFS的应用程序 我的文件被正确地创建在正确的位置,但是Workspace.PendAdd方法仅适用于一个特定的工作空间,其他工作空间会给我提示没有工作文件夹映射错误 我使用的方法是PendAddstring filepath,bool recursive,因此我传入一个要添加的目录,并希望将该目录及其文件作为挂起的外接程序TFS进行添加 这两个工作区除了名称之外其他内容都相同,当前都没有签出任何文件,也不包含任何文件 从我的谷歌搜索中,我发现在将文件添加到

我正在开发一个可以创建项目并将其添加到TFS的应用程序

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

我使用的方法是PendAddstring 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;
      }
然后,我在一个组合框中显示一个工作区列表,并允许用户选择一个

这将调用此方法:

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

您需要先创建本地工作区,然后才能将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
}

同样,我也不确定为什么您的代码不起作用,因为我认为问题的背景比我们在上面的示例中看到的要大。

您能给我们展示一些代码吗?你说你有两个工作区?您是否正在挂起已映射目录的工作区中的添加?我将添加一些代码,尽管这是对TFS方法的一个非常标准的调用,所以我不确定它是否有帮助。我的两个工作区映射到TFS中的同一个位置和不同的本地文件夹,我100%确定我添加到了正确的本地文件夹感谢您的回复。我添加了更多的代码,显示如何设置_selectedWorkspace。通过调试,我确信selectedWorkspace设置正确。我明白了。。。你在哪里做一个“得到”你的工作空间$SourceItem=$TfsVersionControl.GetItem$ServerFolder/$GlobalEntryValue不,等等,我搞糟了。。。但我和你之间唯一的区别是我做了
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
}