使用 Microsoft.TeamFoundation.VersionControl.Client 从 VersionSpec 下载特定文件

Using Microsoft.TeamFoundation.VersionControl.Client to downloading specific files from a VersionSpec

提问人:vfrank66 提问时间:7/8/2017 更新时间:7/11/2017 访问量:680

问:

我试图做的是在特定时间范围内找到推送到我的测试 TFS 团队项目中的所有 .sql 脚本,然后获取查看文件的链接或在我的工作区之外下载该副本。所以我没有必要想得到最新的。这将使应用程序查看在特定时间范围内执行的所有特定.sql更改,然后我将这些文件与分支环境进行比较,以确定在哪个数据库上复制和运行哪个 .sql。

我被困在获取查看文件或下载文件的链接上。我预见到下载文件的问题是我将下载数百个文件,以及我最终将要做的事情来查看每个文件以确定是否可以针对测试之外的其他环境重新运行 .sql 脚本。

 public void GetChangesets(DataTable files,
                           bool excludeManualDatabaseFiles,
                           bool containsExcludedDerictoriesAndFiles)
    {
        // this gets collection-lvl services, in contrast to TfsConfigurationServer (server-lvl)
        Uri serverUri = new Uri("<insert serverUri>");
        var tpc = new TfsTeamProjectCollection(serverUri);
        var vcs = tpc.GetService<VersionControlServer>();

        DateTime testDate;
        DateTime.TryParse("2017-07-01", out testDate);

        VersionSpec fromDateVersion = new DateVersionSpec(testDate);
        VersionSpec toDateVersion = new DateVersionSpec(DateTime.Now);

        vcs.QueryRootBranchObjects(RecursionType.Full);

        string teamProjectName = "<insert team project name>";
        TeamProject[] tps = new TeamProject[]
        {
            vcs.GetTeamProject(teamProjectName)
        };

        DataTable returnedChangesetDetail = new DataTable();
        // Step 1: THIS WORKS
        returnedChangesetDetail.Columns.Add("FileName");
        // Step 2: THIS DOES NOT WORK, this is currently empty !!!!!!
        returnedChangesetDetail.Columns.Add("Uri");


        foreach(TeamProject tp in tps)
        {
            IEnumerable changesets = vcs.QueryHistory(string.Concat("$/", tp.Name, "/Test/SQL"), 
                VersionSpec.Latest,
                deletionId: 0,
                recursion: RecursionType.Full,
                user: null,
                versionFrom: fromDateVersion,
                versionTo: toDateVersion,
                maxCount: int.MaxValue,
                includeChanges: true,
                slotMode: true);



            foreach(Changeset changeset in changesets)
            {

                foreach(Change change in changeset.Changes)
                {
                    string fileName = change.Item.ServerItem;
                    // I think this would be it but its not an accessible link, do I add/remove
                    // something to make this a Uri?
                    //var artifactUrui = change.Item.ArtifactUri; 

                    // Step 1: WORKING
                    lstbxFileNames.Items.Add(fileName);

                 }
            }

        }

    }

我希望这些评论能解释我在寻找什么。这将是一个应用程序,供非开发人员但技术用户查看其环境中所需的更改。他们需要查看大约 100 个文件,我认为 Uri 是他们查看更改的简单方法,然后选择他们需要的文件,同时忽略在步骤 1 中发现的更改,但确定不需要。

C# TFS 团队项目

评论


答:

0赞 starian chen-MSFT 7/11/2017 #1

没有文件的下载 URL。

如果 TFS 版本是 TFS 2015 或更高版本,则可以使用版本控制项 REST API 链接(确保当前用户有权访问目标文件)

否则,您可以提供带有 Path 和 version (date) 参数的按钮/超链接,然后使用 DownloadFile 方法下载文件(临时文件),并将内容流(按流读取内容)发送到客户端,让用户在按钮/超链接单击事件中保存到本地计算机。

评论

0赞 vfrank66 7/12/2017
此方法中的服务器路径是什么?我本来以为是 Item.ServerItem,但这似乎只是抛出一个无效的文件名异常。
0赞 starian chen-MSFT 7/13/2017
@vfrank66 它是 ServerItem,对我来说效果很好。此文件已删除吗?代码是否像这样: DownloadFile(changeset.Item.ServerPath,变更集。Item.DeletionId,新的 DateVersionSpec(changeset.Item.CheckinDate), “D:\\d\\test.cs”);?