我正在尝试编写一个代码,在给定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
就是一个空字符串,即使我确定该文件已在minRevision
和maxRevision
之间进行了修改。
如果文件在minRevision
不存在或在maxRevision
中删除,此代码也会抛出异常,但这似乎是一个需要解决的问题,一旦我把这个工作搞定了只有编辑过的文件。
检查了临时文件后,我确信这两个版本的文件都已正确下载。 diff的计算或将diff写入流或将diff复制到字符串时出错。
答案 0 :(得分:9)
解决。问题是读者。在我将最后两行更改为
之后var diff = Encoding.UTF8.GetString(stream.ToArray());
我终于得到了一些差异。
答案 1 :(得分:3)
我知道你接受了你的答案,这是在2012年被问到的,但我最近不得不做同样的事情,但更喜欢使用StreamReader
vs .ToArray()
答案是您必须在开始阅读之前重置MemoryStream
。
添加此
stream.Position = 0;
冲洗作家后