2016-05-09 39 views
0

Ich weiß, dass dies eine Frage, ohne eine ‚richtige‘ AntwortC# Eingebettete Ressource entspricht Datei

Ich habe eine C# Windows-Anwendung, die eine eingebettete Ressource in der Assembly enthalten hat, kann sein soll. Ich habe versucht, eine Möglichkeit zu finden, den Inhalt meines Ressourcenstroms zu vergleichen, um festzustellen, ob der Inhalt dieses Streams mit einer bestimmten Datei im Dateisystem übereinstimmt.

z.B.

Gibt es einen besseren Weg als einen Byte-für-Byte-Vergleich? Gedanken? (Und Dank im Voraus!)

+1

Sie könnten den Inhalt der beiden Streams Hash-Code, Base64 codieren die zwei Hashes in String-Variablen, dann tun Sie einfach eine einfache a == b Vergleich der Strings. – Kevin

+0

Gute Idee, ich wusste nichts über 'System.Security.Cryptography.HashAlgorithm'. Ich werde dies versuchen und berichten – darkpbj

Antwort

1

Per meinem Kommentar:

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

Wenn Sie auf etwas anderes mit den Strömen nach dem Vergleichen zu tun hat, können Sie die Stream Position Ursprung zurück zu setzen, bevor die Rückkehr aus die Vergleichsmethode.