如何判断捕获的IOException是否是由另一个进程使用的文件引起的,而不需要解析异常的Message属性

Pau*_*ick 10 .net file robustness ioexception

当我打开一个文件时,我想知道它是否被另一个进程使用,所以我可以进行特殊处理; 任何其他IOException我都会冒泡.IOException的Message属性包含"进程无法访问文件'foo',因为它正由另一个进程使用.",但这不适用于编程检测.检测另一个进程正在使用的文件的最安全,最健壮的方法是什么?

Jar*_*Par 14

IOException当从Win32本机函数返回的错误代码是ERROR_SHARING_VIOLATION(Documentation)时,抛出此特定版本.它具有数值0x20但实际上存储在异常0x80070020HRESULT属性上(它是调用MakeHRFromErrorCode的结果).

因此,检查共享冲突的编程方法是检查值HResult上的属性. IOException0x80070020

public static bool IsSharingViolation(this IOException ex) {
  return 0x80070020 == Marshal.GetHRForException(ex);
}
Run Code Online (Sandbox Code Playgroud)

但是,我确实质疑你在由于共享违规而抛出它的场景中你想要做什么.抛出异常的那一刻,其他进程可能会退出,从而删除违规.

  • @richb:在.NET 4.5中,而不是4.0 (4认同)
  • @Anders因为HResult属性具有受保护的可访问级别,因此通常不可访问. (2认同)
  • JaredPar 的回答非常棒,谢谢...回答你的问题;我需要检测这种情况,因为我需要为表示层提供友好的消息 - 由于我的应用程序的性质,如果冲突之后可能不存在也没关系...再次感谢 (2认同)
  • 仅供参考,HResult 属性现在可以在 .Net 4 中公开获取。 (2认同)
  • 我得到'与积分常数的比较是无用的; 常量是int'类型的外部范围,并且表达式计算为False.这工作:( uint)Marshal.GetHRForException(w)== 0x80070020 (2认同)