2016-05-09 3 views
0

に一致するリソース組み込みそのC#のを確認してください。私は自分のリソースストリームの内容を比較して、そのストリームの内容がファイルシステム上の特定のファイルと一致するかどうかを判断する方法を考え出しました。は、私はこれは私が埋め込まれたリソースは、アセンブリに含まれているC#のWindowsアプリケーションを持っている1「正しい」答え</p> <p>のない質問かもしれであることを知っているファイル

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

2つのストリームの内容をハッシュし、base64で2つのハッシュを文字列変数にエンコードし、単純なa == bの比較を行います。 – 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(); 
    } 

あなたが比較した後のストリームで何かを行う上で計画している場合、あなたがから復帰する前に戻って原点にストリーム位置を設定することもできます比較メソッド。

関連する問題

 関連する問題