編集:コードを期待どおりに機能させるため、これを例題に戻しました。C#MD5ハッシャーの例
ファイルをコピーし、MD5ハッシュを取得してからコピーを削除しようとしています。私は元のファイルのプロセスロックを避けるためにこれをやっています。これは別のアプリケーションが書き込むものです。しかし、私はコピーしたファイルをロックしています。
File.Copy(pathSrc, pathDest, true);
String md5Result;
StringBuilder sb = new StringBuilder();
MD5 md5Hasher = MD5.Create();
using (FileStream fs = File.OpenRead(pathDest))
{
foreach(Byte b in md5Hasher.ComputeHash(fs))
sb.Append(b.ToString("x2").ToLower());
}
md5Result = sb.ToString();
File.Delete(pathDest);
私はその後、「File.Delete()
に例外「プロセスはファイルにアクセスできません」取得しています。
using
ステートメントでは、ファイルストリームがうまく閉じられないことが予想されます。私はまた、using
を取り除いてファイルストリームを別に宣言しようとしましたが、読み込んだ後にfs.Close()
とfs.Dispose()
と書いてみました。
この後、私は実際にmd5の計算をコメントアウトし、コードは削除されているので、ComputeHash(fs)
と何かのように見えます。
ReadAllBytes()を呼び出して終了するのはなぜですか? – BobbyShaftoe
computeHashの呼び出しはストリーム上で動作するため、ファイルが大きい場合はメモリ内にすべて保持する必要はありません。 –
ファイルを削除する前にファイルを閉じる必要はありませんか? – JonnyBoats