Search code examples
c#streamembedded-resourcechecksumsystem.io.file

Verify that c# Embedded Resource matches file


I know that this is may be a question without one 'right' answer

I have a C# windows application that has an embedded resource included in the assembly. I've been trying to come up with a way to compare the contents of my resource stream to determine if the contents of that stream matches a particular file on the file system.

e.g.

using(var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(@"Manifest/Resource/Path/thing.exe"))
using(var fileStream = new FileStream(@"File/System/Path/thing.exe", FileMode.Read))
    // Compare Contents (thing.exe may be an older version)
    if(CompareStreamContents(resourceStream, fileStream))
    {
        /* Do a thing */
    }
    else
    {
        /* Do another thing*/
    }

Is there a better way than simply doing a byte-by-byte comparison? Thoughts? (and thanks in advance!)


Solution

  • Per my comment:

        private bool CompareStreamContents(Stream resourceStream, Stream fileStream)
        {
            var sha = new SHA256CryptoServiceProvider();
            var hash1 = Convert.ToBase64String(sha.ComputeHash(ReadToEnd(resourceStream)));
            var hash2 = Convert.ToBase64String(sha.ComputeHash(ReadToEnd(fileStream)));
            return hash1 == hash2;
        }
    
        private byte[] ReadToEnd(Stream stream)
        {
            var continueRead = true;
            var buffer = new byte[0x10000];
            var ms = new MemoryStream();
            while (continueRead)
            {
                var size = stream.Read((byte[])buffer, 0, buffer.Length);
                if (size > 0)
                {
                    ms.Write(buffer, 0, size);
                }
                else
                {
                    continueRead = false;
                }
            }
    
            return ms.ToArray();
        }
    

    If you plan on doing something else with the streams after the compare, you may want to set the stream position back to origin before returning from the compare method.