C# 比较两个文件时出现问题-false何时应为true?
我尝试使用逐字节比较,还比较了文件的计算哈希(下面的代码示例)。我有一个文件,复制它-比较两者-结果是真的。但当我打开其中一个文件时,问题就开始了: 对于MS word文件-在打开和关闭其中一个文件后,结果仍然为真,但是,例如,当我删除文件中的最后一个符号,然后重新写入,然后再次尝试比较-结果为假。文件基本上是一样的,但从理论上讲,一个字节一个字节的文件似乎已经不一样了 对于Excel文件-即使打开文件也会导致函数返回false。真的应该是这样吗?我能想到的唯一改变就是最后一次访问时间。但在逐字节比较时,它是否考虑到了这一点 所以我想问,这个比较真的应该像这样工作吗?我能做些什么来回避这个问题吗?在我的程序中,我将主要比较.pdf文件,其中编辑将不是一个很大的选项,但我仍然想知道为什么它会这样做 带缓冲区的逐字节:C# 比较两个文件时出现问题-false何时应为true?,c#,.net,compare,C#,.net,Compare,我尝试使用逐字节比较,还比较了文件的计算哈希(下面的代码示例)。我有一个文件,复制它-比较两者-结果是真的。但当我打开其中一个文件时,问题就开始了: 对于MS word文件-在打开和关闭其中一个文件后,结果仍然为真,但是,例如,当我删除文件中的最后一个符号,然后重新写入,然后再次尝试比较-结果为假。文件基本上是一样的,但从理论上讲,一个字节一个字节的文件似乎已经不一样了 对于Excel文件-即使打开文件也会导致函数返回false。真的应该是这样吗?我能想到的唯一改变就是最后一次访问时间。但在逐字
static bool FilesAreEqualFaster(string f1, string f2)
{
// get file length and make sure lengths are identical
long length = new FileInfo(f1).Length;
if (length != new FileInfo(f2).Length)
return false;
byte[] buf1 = new byte[4096];
byte[] buf2 = new byte[4096];
// open both for reading
using (FileStream stream1 = File.OpenRead(f1))
using (FileStream stream2 = File.OpenRead(f2))
{
// compare content for equality
int b1, b2;
while (length > 0)
{
// figure out how much to read
int toRead = buf1.Length;
if (toRead > length)
toRead = (int)length;
length -= toRead;
// read a chunk from each and compare
b1 = stream1.Read(buf1, 0, toRead);
b2 = stream2.Read(buf2, 0, toRead);
for (int i = 0; i < toRead; ++i)
if (buf1[i] != buf2[i])
return false;
}
}
return true;
}
除此之外,此代码是错误的:
b1 = stream1.Read(buf1, 0, toRead);
b2 = stream2.Read(buf2, 0, toRead);
for (int i = 0; i < toRead; ++i)
if (buf1[i] != buf2[i])
return false;
b1=stream1.Read(buf1,0,toRead);
b2=stream2.Read(buf2,0,toRead);
对于(int i=0;i
您忽略了b1
和b2
彼此不相等以及toRead
的可能性。如果当您请求30个字节时,您只从第一个流读取10个字节,从第二个流读取20个字节,该怎么办?您可能尚未到达文件的末尾,但它仍可能返回比您要求的数据少的数据。永远不要忽略流的返回值。读取。(您将其保存在变量中,但随后忽略该变量。)
基本上,您需要有独立的缓冲区,在必要时补充这些缓冲区-跟踪您在每个缓冲区中的位置,以及有多少有用的数据。需要时,将更多数据读入每个缓冲区
然后还有另一个问题,就是文件实际上是通过打开它们来改变的,正如亨克所提到的。当然,如果你编辑文件,它们只是“基本相同”,那么它们就不一样了,结果应该是错误的……问题是它们实际上是一样的——我只是删除一个simbol,然后写回并保存上下文,格式,所有内容都是相同的,但在字节级别,它们变得不同。我想我只能忍受这种情况,因为我只需要比较.pdf文件,因为它们看起来不那么敏感。
b1 = stream1.Read(buf1, 0, toRead);
b2 = stream2.Read(buf2, 0, toRead);
for (int i = 0; i < toRead; ++i)
if (buf1[i] != buf2[i])
return false;