C# 比较两个文件时出现问题-false何时应为true?

C# 比较两个文件时出现问题-false何时应为true?,c#,.net,compare,C#,.net,Compare,我尝试使用逐字节比较,还比较了文件的计算哈希(下面的代码示例)。我有一个文件,复制它-比较两者-结果是真的。但当我打开其中一个文件时,问题就开始了: 对于MS word文件-在打开和关闭其中一个文件后,结果仍然为真,但是,例如,当我删除文件中的最后一个符号,然后重新写入,然后再次尝试比较-结果为假。文件基本上是一样的,但从理论上讲,一个字节一个字节的文件似乎已经不一样了 对于Excel文件-即使打开文件也会导致函数返回false。真的应该是这样吗?我能想到的唯一改变就是最后一次访问时间。但在逐字

我尝试使用逐字节比较,还比较了文件的计算哈希(下面的代码示例)。我有一个文件,复制它-比较两者-结果是真的。但当我打开其中一个文件时,问题就开始了:

对于MS word文件-在打开和关闭其中一个文件后,结果仍然为真,但是,例如,当我删除文件中的最后一个符号,然后重新写入,然后再次尝试比较-结果为假。文件基本上是一样的,但从理论上讲,一个字节一个字节的文件似乎已经不一样了

对于Excel文件-即使打开文件也会导致函数返回false。真的应该是这样吗?我能想到的唯一改变就是最后一次访问时间。但在逐字节比较时,它是否考虑到了这一点

所以我想问,这个比较真的应该像这样工作吗?我能做些什么来回避这个问题吗?在我的程序中,我将主要比较.pdf文件,其中编辑将不是一个很大的选项,但我仍然想知道为什么它会这样做

带缓冲区的逐字节:

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;