如何确定System.IO.IOException的HResult?
- 论坛
- 如何确定System.IO.IOException的HResult?
4 浏览
如何确定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这样的无符号整数吗?