La propiedad System.Exception.HResult está protegida. ¿Cómo puedo ver dentro de una excepción y obtener el resultado HR sin recurrir a la reflexión u otros hacks feos?¿Cómo determino HResult para System.IO.IOException?
Esta es la situación:
Quiero escribir una herramienta de copia de seguridad, que se abre y lee los archivos en un sistema. Abrí el archivo con FileAccess.Read y FileShare.ReadWrite, de acuerdo con this guidance, porque no me importa si el archivo está abierto para la escritura en el momento en que lo leí.
En algunos casos, cuando un archivo que estoy leyendo está abierto por otra aplicación, el método System.IO.FileStream.Read() arroja una excepción System.IO.IOException, "El proceso no puede acceder al archivo porque otro proceso tiene bloqueó una parte del archivo ". Esto es error 33, o creo HResult 0x80070021. [EDITAR :. Creo que esto puede ser devuelto cuando otro proceso llama LockFileEx para bloquear un rango de bytes dentro de un archivo]
me gustaría hacer una pausa y volver a intentar cuando me sale este error. Creo que esta es la acción adecuada para tomar aquí. Si el proceso de bloqueo libera el bloqueo de rango de bytes rápidamente, entonces puedo continuar leyendo el archivo.
¿Cómo puedo distinguir una IOException por este motivo, de otros? Puedo pensar de estas maneras:
- reflexión privada - no quiero hacer eso. Perf apestará.
- llama a Exception.ToString() y analiza la cadena. Se siente hacky. No funcionará en las versiones i18n.
No me gustan estas opciones. ¿No hay una manera mejor y más limpia?
Acabo de buscar y encontré System.Runtime.InteropServices.Marshal.GetHRForException. ¿Eso devolverá un uint como 0x80070021?
> reflexión privada - no quiero hacer eso. Perf apestará. - La perfusión de excepciones huele de todos modos, así que no me preocuparía el aspecto del rendimiento. La reflexión, sin embargo, requiere FullTrust, es fea y no es compatible y es propensa a la rotura, por lo que no deberías hacerlo. –