1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
using System;
using System.IO;
namespace WixToolset.Dtf.Tools.DDiff
{
public class FileDiffEngine : IDiffEngine
{
public FileDiffEngine()
{
}
public virtual float GetDiffQuality(string diffInput1, string diffInput2, string[] options, IDiffEngineFactory diffFactory)
{
if(diffInput1 != null && File.Exists(diffInput1) &&
diffInput2 != null && File.Exists(diffInput2))
{
return .10f;
}
else
{
return 0;
}
}
public bool GetDiff(string diffInput1, string diffInput2, string[] options, TextWriter diffOutput, string linePrefix, IDiffEngineFactory diffFactory)
{
bool difference = false;
FileInfo file1 = new FileInfo(diffInput1);
FileInfo file2 = new FileInfo(diffInput2);
if(file1.Length != file2.Length)
{
diffOutput.WriteLine("{0}File size: {1} -> {2}", linePrefix, file1.Length, file2.Length);
difference = true;
}
else
{
FileStream stream1 = file1.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
FileStream stream2 = file2.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] buf1 = new byte[512];
byte[] buf2 = new byte[512];
while(!difference)
{
int count1 = stream1.Read(buf1, 0, buf1.Length);
int count2 = stream2.Read(buf2, 0, buf2.Length);
for(int i = 0; i < count1; i++)
{
if(i == count2 || buf1[i] != buf2[i])
{
difference = true;
break;
}
}
if(count1 < buf1.Length) // EOF
{
break;
}
}
stream1.Close();
stream2.Close();
if(difference)
{
diffOutput.WriteLine("{0}Files differ.", linePrefix);
}
}
return difference;
}
public virtual IDiffEngine Clone()
{
return new FileDiffEngine();
}
}
}
|