2017-01-17 8 views
1

特定のファイルのMD5およびSHA1チェックサムを計算するメソッドの実行中に問題が発生しました。私の方法は次のようになります。
SHA1を:MD5およびSHA1チェックサムの計算中にIOExceptionが発生する

public string HashFile(string toHash) 
    { 
     SHA1 SHA1ENGINE = SHA1.Create(); 
     byte[] hashBytes = SHA1ENGINE.ComputeHash(File.Open(toHash, FileMode.Open, FileAccess.Read)); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < hashBytes.Length; i++) 
     { 
      sb.Append(hashBytes[i].ToString("X2")); 
     } 
     return sb.ToString(); 
    } 


MD5:プロセスはファイルにアクセスできません「(:

public string HashFile(string toHash) 
    { 
     MD5 MD5ENGINE = MD5.Create(); 
     byte[] hashBytes = MD5ENGINE.ComputeHash(File.Open(toHash, FileMode.Open, FileAccess.Read)); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < hashBytes.Length; i++) 
     { 
      sb.Append(hashBytes[i].ToString("X2")); 
     } 
     return sb.ToString(); 
    } 


これらのいずれかの方法を実行している間、私はIOExceptionが取得PATHTOFILE) 'は別のプロセスで使用されているためです。
これは永続的な問題です。私のPC上のファイルのチェックサムは計算できません。私はローカル管理者としてログオンしており、VSは管理者として開かれています。これは、たとえばC:\ TEMP、C:\ Users \ Administrator \ Desktopなど、私が試したどのディレクトリでも永続的です。実際にファイルをロックするプロセスが存在する可能性があるので、私はまた、私のPCを再起動しようとしましたが、それは助けにはなりませんでした。

最初は私が使用することを試みた:

byte[] hashBytes = SHA1ENGINE.ComputeHash(File.OpenRead(toHash)); 

をしかし、記載されている問題といくつかの調査に遭遇した後、私はそれに変更しました:

byte[] hashBytes = SHA1ENGINE.ComputeHash(File.Open(toHash, FileMode.Open, FileAccess.Read)); 

これも助けにはなりませんでした。

+0

'File.Open()'は、削除すべきものを返します。 – CodeCaster

+0

file.openでusingステートメントを使用する必要があります。https://msdn.microsoft.com/en-us/library/b9skfh7s(v=vs.110).aspx – JOSEFtw

答えて

6

ファイルを閉じずに開いています。ちょうどあなたがusing文でそれを閉じることができますので、別途ストリームを開く:

MD5 md5 = MD5.Create(); 
using (var stream = File.Open(...)) 
{ 
    var hash = md5.ComputeHash(stream); 
    // ... 
} 

(私はまた、重複を避けるために、コードを「Hexに変換する」分離することをお勧めしたいあなたも、ファイル名を取る方法を持つことができます。同じプロセスを含む別のファイルストリームを()を開くコードを防ぐことができます...しかし、それは助けにはなりません開いているファイルストリームを保持あなたコードを避けることができますさらに重複を避けるとHashAlgorithm ...)

他の場所で現在開かれているフライについてはあなたがそれを読むためにファイルを開くことができない場合、あなたは単純にハッシュを計算することができません。

+0

'using'ステートメントは実際に助けられましたが、完全には役に立たない。私はまだいくつかのファイルにつかまっています。 –

+0

@PiotrTruszkowski:おそらくそれらのファイル*は他のアプリケーションで開かれていますか?あなたが単にファイルを開くことができない場合、あなたはできることがたくさんありません... –

+0

情報ありがとうございます。私はちょうど_locked_としてファイルをマークし、トリックを行う必要があります... –

関連する問題