如何确定System.IO.IOException的HResult?

4 浏览
0 Comments

如何确定System.IO.IOException的HResult?

System.Exception.HResult属性是受保护的。如何在不使用反射或其他丑陋的方法的情况下查看异常并获取HResult?

以下是情况:

我想编写一个备份工具,用于打开和读取系统上的文件。

根据此指南,我使用FileAccess.Read和FileShare.ReadWrite打开文件,因为我不在乎读取时文件是否处于写入状态。

在某些情况下,当我正在读取的文件被另一个应用程序打开时,System.IO.FileStream.Read()方法会抛出System.IO.IOException异常,错误消息为“由于另一个进程锁定了文件的一部分,无法访问该文件”。这是错误33,或者我认为是HResult 0x80070021。[编辑:我相信当另一个进程调用LockFileEx锁定文件中的字节范围时,可能会返回这个错误。]

当我遇到这个错误时,我希望暂停一下并重试。我认为这是适当的操作。如果锁定进程迅速释放字节范围锁定,那么我可以继续读取文件。

如何区分这个错误的IOException和其他错误?我可以考虑以下几种方法:

- 私有反射 - 不想这样做。性能会很差。

- 调用Exception.ToString()并解析字符串。感觉像是一个hack。在国际化版本中无法工作。

我不喜欢这些选项。没有更好、更干净的方法吗?

我刚刚搜索到System.Runtime.InteropServices.Marshal.GetHRForException。它会返回像0x80070021这样的无符号整数吗?

0