static bool CompareFileContent(string file1, string file2)
{
// 自定义每次比较的数组大小,自行取决大小
const int BYTES_TO_READ = 1024;
using FileStream fs1 = File.Open(file1, FileMode.Open);
using FileStream fs2 = File.Open(file2, FileMode.Open);
byte[] one = new byte[BYTES_TO_READ];
byte[] two = new byte[BYTES_TO_READ];
bool result = true;
while (true)
{
int len1 = fs1.Read(one);
int len2 = fs2.Read(two);
unsafe
{
fixed (byte* ptr1 = one, ptr2 = two)
{
for (int i = 0; i < BYTES_TO_READ; i++)
{
if (*(ptr1 + i) != *(ptr2 + i))
{
result=false;
break;
}
}
}
}
if (!result || len1 == 0 || len2 == 0)
break;
}
return result;
}
public static bool CompareByReadOnlySpan(string file1, string file2)
{
const int BYTES_TO_READ = 10240;
using (FileStream fs1 = File.Open(file1, FileMode.Open))
using (FileStream fs2 = File.Open(file2, FileMode.Open))
{
byte[] one = new byte[BYTES_TO_READ];
byte[] two = new byte[BYTES_TO_READ];
while (true)
{
int len1 = fs1.Read(one, 0, BYTES_TO_READ);
int len2 = fs2.Read(two, 0, BYTES_TO_READ);
if (!((ReadOnlySpan<byte>)one).SequenceEqual((ReadOnlySpan<byte>)two)) return false;
if (len1 == 0 || len2 == 0) break;
}
}
return true;
}
public static bool CompareFileContent2(string file1, string file2)
{
// 自定义每次比较的数组大小,自行取决大小
int BYTES_TO_READ = Vector<byte>.Count;
using FileStream fs1 = File.Open(file1, FileMode.Open);
using FileStream fs2 = File.Open(file2, FileMode.Open);
byte[] one = new byte[BYTES_TO_READ];
byte[] two = new byte[BYTES_TO_READ];
bool result = true;
while (true)
{
int len1 = fs1.Read(one);
int len2 = fs2.Read(two);
Vector<byte> vector = new Vector<byte>(one);
Vector<byte> vector2 = new Vector<byte>(two);
result = vector== vector2;
if (!result || len1 == 0 || len2 == 0)
break;
}
return result;
}
public static bool CompareByMD5(string file1, string file2)
{
using (var md5 = MD5.Create())
{
byte[] one, two;
using (var fs1 = File.Open(file1, FileMode.Open))
{
one = md5.ComputeHash(fs1);
}
using (var fs2 = File.Open(file2, FileMode.Open))
{
two = md5.ComputeHash(fs2);
}
// 将MD5结果(字节数组)转换成字符串进行比较
return BitConverter.ToString(one) == BitConverter.ToString(two);
}
}
使用文件大小为:
结果:
文件大小:
结果:
比较文件大小:
结果:
比较文件:
结果:
总结:文件小时CompareFileContent2快,其次CompareByReadOnlySpan,文件大时CompareByReadOnlySpan最快。