Свойство System.Exception.HResult защищено. Как я могу заглянуть внутрь исключения и получить HResult, не прибегая к размышлениям или другим уродливым хакам?
Здесь ситуация:
Я хочу написать средство резервного копирования, которое открывает и читает файлы в системе.
Я открываю файл с FileAccess.Read и FileShare.ReadWrite, в соответствии с этим руководством, потому что мне все равно, открыт ли файл для записи в то время, когда я читал Это.
В некоторых случаях, когда файл, который я читаю, открывается другим приложением, метод System.IO.FileStream.Read() генерирует исключение System.IO.IOException: "Процесс не может получить доступ к файлу, потому что другой процесс заблокирован часть файла". Это ошибка 33, или я думаю, что HResult 0x80070021. [ EDIT: Я считаю, что это может быть возвращено, когда другой процесс вызывает LockFileEx, чтобы заблокировать диапазон байтов в файле. ]
Я хочу сделать паузу и повторить попытку, когда я получу эту ошибку. Я думаю, что это подходящее действие для этого. Если процесс блокировки быстро освобождает блокировку байтового диапазона, я могу продолжить чтение файла.
Как я могу отличить IOException по этой причине от других? Я могу думать об этих путях:
- частное отражение - не хочу этого делать. Перф воняет.
- вызовите Exception.ToString() и проанализируйте строку. Чувствует себя взломанным. Не будет работать в версиях i18n.
Мне не нравятся эти параметры. Нет ли лучшего, более чистого пути?
Я просто обыскал и нашел System.Runtime.InteropServices.Marshal.GetHRForException. Будет ли это возвращать uint как 0x80070021?