Search code examples
c#filecompare

Compare binary files in C#


I want to compare two binary files. One of them is already stored on the server with a pre-calculated CRC32 in the database from when I stored it originally.

I know that if the CRC is different, then the files are definitely different. However, if the CRC is the same, I don't know that the files are. So, I'm looking for a nice efficient way of comparing the two streams: one from the posted file and one from the file system.

I'm not an expert on streams, but I'm well aware that I could easily shoot myself in the foot here as far as memory usage is concerned.


Solution

  • static bool FileEquals(string fileName1, string fileName2)
    {
        // Check the file size and CRC equality here.. if they are equal...    
        using (var file1 = new FileStream(fileName1, FileMode.Open))
            using (var file2 = new FileStream(fileName2, FileMode.Open))
                return FileStreamEquals(file1, file2);
    }
    
    static bool FileStreamEquals(Stream stream1, Stream stream2)
    {
        const int bufferSize = 2048;
        byte[] buffer1 = new byte[bufferSize]; //buffer size
        byte[] buffer2 = new byte[bufferSize];
        while (true) {
            int count1 = stream1.Read(buffer1, 0, bufferSize);
            int count2 = stream2.Read(buffer2, 0, bufferSize);
    
            if (count1 != count2)
                return false;
    
            if (count1 == 0)
                return true;
    
            // You might replace the following with an efficient "memcmp"
            if (!buffer1.Take(count1).SequenceEqual(buffer2.Take(count2)))
                return false;
        }
    }