System.Exception.HResult 属性受保护。如何在不诉诸反射或其他丑陋黑客的情况下查看异常并获取 HResult?
情况如下:
我想编写一个备份工具,它可以打开和读取系统上的文件。根据本指南,我使用 FileAccess.Read 和 FileShare.ReadWrite 打开文件,因为我不在乎文件在读取时是否打开以进行写入。
在某些情况下,当我正在读取的文件被另一个应用程序打开时,System.IO.FileStream.Read() 方法会抛出 System.IO.IOException,“该进程无法访问该文件,因为另一个进程已锁定一部分文件”。这是错误 33,或者我认为是 HResult 0x80070021。[编辑:我相信当另一个进程调用LockFileEx来锁定文件中的字节范围时,可以返回。]
当我收到此错误时,我想暂停并重试。我认为这是在这里采取的适当行动。如果锁定过程快速释放字节范围锁定,那么我可以继续读取文件。
由于这个原因,我如何将 IOException 与其他人区分开来?我可以想到这些方法:
- 私人反思 - 不想那样做。性能会发臭。
- 调用 Exception.ToString() 并解析字符串。感觉很hacky。不适用于 i18n 版本。
我不喜欢这些选项。难道没有更好、更清洁的方法吗?
我只是四处搜索,发现System.Runtime.InteropServices.Marshal.GetHRForException。这会返回一个像 0x80070021 这样的 uint 吗?