La proprietà System.Exception.HResult è protetta. Come posso sbirciare all'interno di un'eccezione e ottenere l'HResult senza ricorrere a riflessioni o altri brutti hack?Come si determina HResult per System.IO.IOException?
Ecco la situazione:
Voglio scrivere uno strumento di backup, che si apre e legge i file su un sistema. Apro il file con FileAccess.Read e FileShare.ReadWrite, secondo this guidance, perché non mi interessa se il file è aperto per la scrittura al momento in cui l'ho letto.
In alcuni casi, quando un file che sto leggendo è aperto da un'altra app, il metodo System.IO.FileStream.Read() genera un System.IO.IOException, "Il processo non può accedere al file perché un altro processo ha bloccato una parte del file ". Questo è error 33 o penso HResult 0x80070021. [EDIT :. Credo che questo può essere restituito quando un altro processo chiama LockFileEx per bloccare un intervallo di byte all'interno di un file]
mi piacerebbe mettere in pausa e riprovare quando ottengo questo errore. Penso che questa sia l'azione appropriata da portare qui. Se il processo di blocco rilascia rapidamente il blocco dell'intervallo di byte, posso continuare a leggere il file.
Come posso distinguere una IOException per questo motivo, da altri? Posso pensare a questi modi:
- riflessione privata - non voglio farlo. La perfezione puzzerà.
- chiama Exception.ToString() e analizza la stringa. Sembra hacky. Non funzionerà nelle versioni i18n.
Non mi piacciono queste opzioni. Non c'è un modo migliore, più pulito?
Ho appena cercato in giro e ho trovato System.Runtime.InteropServices.Marshal.GetHRForException. Ciò restituirà un uint come 0x80070021?
> riflessione privata - voglio non farlo. La perfezione puzzerà. - L'eccezione perf puzza comunque, quindi non mi preoccuperei dell'aspetto perf. La riflessione, tuttavia, richiede FullTrust, è brutta, non è supportata e soggetta a rotture - ecco perché non dovresti farlo. –