2016-05-09 4 views
0

Я знаю, что это может быть вопрос без одного «правильного» ответаУбедитесь, что C# Embedded Resource соответствует файл

У меня есть приложение # Windows C, который имеет встроенный ресурс включен в сборку. Я пытаюсь найти способ сравнить содержимое потока ресурсов, чтобы определить, соответствует ли содержимое этого потока конкретному файлу в файловой системе.

например.

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*/ 
    } 

Есть ли лучший способ, чем просто делать байтовое сравнение? Мысли? (И спасибо заранее!)

+1

Вы можете записать содержимое двух потоков, base64 закодировать два хэша в строковые переменные, а затем просто выполнить сравнение строк. – Kevin

+0

Хорошая идея, я не знал о 'System.Security.Cryptography.HashAlgorithm'. Я собираюсь сделать это выстрелом и отчитаться – darkpbj

ответ

1

За мой комментарий:

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(); 
    } 

Если вы планируете делать что-то другое с потоками после того, как сравнение, вы можете захотеть установить позицию потока обратно происхождения до возвращения из метод сравнения.

Смежные вопросы