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

标签 .net file ioexception robustness

当我打开一个文件时,我想知道它是否正在被另一个进程使用,以便我可以执行特殊处理;任何其他 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/

相关文章:

.net - dot net maui 图像控件不显示远程源

.net - Github 操作 : Report dotnet test result as annotations

java - 从文件中解析文本时没有新行的空间?

java - 我的 Android 应用程序中出现 IOException

php - 服务器错误5006:供应商未指定重定向URL,但已指定URL

c# - 在 c# asp.net 中获取列表框的选定值

java - 我无法将图像直接保存到应用程序目录的文件夹中

c - fputs 制造问题

Java:如何在没有异常的情况下停止服务器(关闭套接字)?

java - Android Studio 一直告诉我找不到该文件