System.Exception.HResult属性是受保护的。如何在不使用反射或其他丑陋的方法的情况下查看异常并获取HResult?
这是情况:
我想编写一个备份工具,用于在系统上打开和读取文件。
根据这个指南,我使用FileAccess.Read和FileShare.ReadWrite打开文件,因为我不关心读取时文件是否可以写入。
但有些情况下,当我读取的某个文件被另一个应用程序打开时,System.IO.FileStream.Read()方法会抛出System.IO.IOException异常,显示“由于另一个进程锁定了文件的某部分,进程无法访问该文件”。这是错误33,或者我认为是HResult 0x80070021 [编辑: 我相信当另一个进程调用LockFileEx来锁定文件中的字节范围时,也可能返回此错误。]。
我想在遇到这种错误时暂停并重试。我认为这是需要采取的适当措施。如果锁定进程快速释放字节范围锁,则我可以继续阅读文件。
如何区分出现这种原因的IOException和其他IOException?我可以考虑以下几种方法:
- 私有反射-不想这样做。性能会很差。
- 调用Exception.ToString()并解析字符串。感觉很麻烦。在i18n版本中无法使用。
我不喜欢这些选项。有没有更好、更清晰的方法呢?
我刚刚搜索并找到了System.Runtime.InteropServices.Marshal.GetHRForException。它会返回像0x80070021这样的无符号整数吗?