我在支持复制文件的产品中有一些代码:
using(System.IO.FileStream sourceFS = new System.IO.FileStream(sourcePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read))
{
using(System.IO.FileStream targetFS = new System.IO.FileStream(targetPath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.Read))
{
while((read = sourceFS.Read(buffer, 0, buffer.Length)) > 0)
{
targetFS.Write(buffer, 0, read);
}
targetFS.Flush();
targetFS.Close();
}
sourceFS.Close();
}
不幸的是,用户报告了一个异常,通知我们目标文件正由另一个进程使用。我问过是否有人打开文件(这是一个Excel文件) - 显然不是......
所以,我把思考上限......我们是否有可能将文件锁定在目标文件中?我可以看到targetFS不被关闭的唯一方法是:
对我来说这听起来不太可能,但好奇的是我使用JetBrains中的dotPeek来反汇编FileStream类上的Dispose方法 - 这似乎并没有真正做到这一点 - 我猜它提供了“近距离”行为通过处理手柄......
从本质上讲 - 问题是这个 - 有人能发现这可能会导致文件被锁定吗?
答案 0 :(得分:2)
看看其他地方。这段代码很好。不知道还有什么可说的。 using
仅用于此用例 - 故障安全处理。
使用Process Explorer调查哪个进程持有相关文件的句柄。