編輯:作爲代碼按預期工作,我改名這一個例子。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 2009-05-06 00:27:31
因爲他對computeHash的調用在流上運行 - 如果文件很大,他不需要將它全部保存在內存中。 – 2009-05-06 00:35:05
在您付款之前,您是否需要關閉該文件? – JonnyBoats 2009-05-06 00:53:19