以编程方式在TFS中获取文件的两个版本之间的差异

时间:2012-06-29 14:03:25

标签: c# tfs tfs2010 tfs-sdk

我正在尝试编写一个代码,在给定TFS存储库中的项目路径和两个修订版本的情况下,将计算内容文件在这两个时刻之间的差异。现在代码可能如下所示:

using (var projectCollection = new TfsTeamProjectCollection(new Uri(repositoryUrl)))
{
    projectCollection.EnsureAuthenticated();
    var versionControlServer = (VersionControlServer)projectCollection.GetService(typeof(VersionControlServer));

    string path = "$/MyProject/path/to/file.xml"

    var before = new DiffItemVersionedFile(versionControlServer, path, VersionSpec.ParseSingleSpec(minRevision.ToString(), null));
    var after = new DiffItemVersionedFile(versionControlServer, path, VersionSpec.ParseSingleSpec(maxRevision.ToString(), null));

    using (var stream = new MemoryStream())
    using (var writer = new StreamWriter(stream))
    {
        var options = new DiffOptions();
        options.Flags = DiffOptionFlags.EnablePreambleHandling;
        options.OutputType = DiffOutputType.Unified;
        options.TargetEncoding = Encoding.UTF8;
        options.SourceEncoding = Encoding.UTF8;
        options.StreamWriter = writer;
        Difference.DiffFiles(versionControlServer, before, after, options, path, true);
        writer.Flush();

        var reader = new StreamReader(stream);
        var diff = reader.ReadToEnd();
    }
}

但是一旦执行了此代码,变量diff就是一个空字符串,即使我确定该文件已在minRevisionmaxRevision之间进行了修改。

如果文件在minRevision不存在或在maxRevision中删除,此代码也会抛出异常,但这似乎是一个需要解决的问题,一旦我把这个工作搞定了只有编辑过的文件。

修改

检查了临时文件后,我确信这两个版本的文件都已正确下载。 diff的计算或将diff写入流或将diff复制到字符串时出错。

2 个答案:

答案 0 :(得分:9)

解决。问题是读者。在我将最后两行更改为

之后
var diff = Encoding.UTF8.GetString(stream.ToArray());

我终于得到了一些差异。

答案 1 :(得分:3)

我知道你接受了你的答案,这是在2012年被问到的,但我最近不得不做同样的事情,但更喜欢使用StreamReader vs .ToArray()

答案是您必须在开始阅读之前重置MemoryStream

添加此

stream.Position = 0;
冲洗作家后