当我打开一个文件时,我想知道它是否正在被另一个进程使用,以便我可以执行特殊处理;任何其他 IOException 我都会冒泡。 IOException 的 Message 属性包含“进程无法访问文件‘foo’,因为它正在被另一个进程使用。”,但这不适合编程检测。检测另一个进程正在使用的文件的最安全、最可靠的方法是什么?
最佳答案
当从 Win32 native 函数返回的错误代码为 ERROR_SHARING_VIOLATION
( Documentation) ) 时,会引发此特定版本的 IOException
。它的数值为 0x20
,但实际上在异常的 HRESULT
属性上存储为 0x80070020
(它是调用 MakeHRFromErrorCode 的结果)。
因此,检查共享冲突的编程方法是检查 IOException
上的 HResult
属性的值 0x80070020
。
public static bool IsSharingViolation(this IOException ex) {
return 0x80070020 == Marshal.GetHRForException(ex);
}
但是,我确实质疑在由于共享违规而引发该问题的情况下您究竟想要做什么。当抛出异常时,其他进程可能会退出,从而消除违规。
关于.net - 如何判断捕获的 IOException 是否是由另一个进程使用该文件引起的,而不需要解析异常的 Message 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2568875/