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