Свойство 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?