11

TFSリポジトリ内のアイテムへのパスと2つのリビジョンを指定して、これら2つの時点でのコンテンツファイルの違いを計算するコードを作成しようとしています。今のところ、コードは次のようになります。

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の文字列へのコピーに問題があります。

4

2 に答える 2

9

解決しました。問題は読者でした。最後の2行を次のように変更した後

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

やっと差分が取れました。

于 2012-06-29T14:34:52.283 に答える
3

あなたがあなたの答えを受け入れたことは知っています。これは2012年に尋ねられましたが、最近同じことをしなければなりませんでしたが、StreamReadervs.ToArray()

答えは、MemoryStream読み取りを開始する前に をリセットする必要があるということです。

これを追加

stream.Position = 0;

ライターをフラッシュした直後

于 2015-11-08T20:06:29.607 に答える