【发布时间】:2009-05-06 00:24:01
【问题描述】:
编辑:我已将其重命名为示例,因为代码按预期工作。
我正在尝试复制一个文件,获取一个 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() 并完成它?
-
因为他对 computeHash 的调用是在流上运行的——如果文件很大,他就不需要把它全部保存在内存中。
-
删除前不需要关闭文件吗?