Die Eigenschaft System.Exception.HResult ist geschützt. Wie kann ich in eine Ausnahme hineinschauen und das HResult erhalten, ohne auf Reflektion oder andere hässliche Hacks zurückgreifen zu müssen?Wie ermittle ich das HResult für eine System.IO.IOException?
Hier ist die Situation:
ich ein Backup-Tool zu schreiben, das sich öffnet und liest Dateien auf einem System. Ich öffne die Datei mit FileAccess.Read und FileShare.ReadWrite, nach this guidance, weil es mir egal ist, wenn die Datei zum Zeitpunkt des Lesens zum Schreiben geöffnet ist.
In einigen Fällen löst die Methode System.IO.FileStream.Read(), wenn eine von mir gelesene Datei von einer anderen Anwendung geöffnet wird, eine System.IO.IOException aus: "Der Prozess kann nicht auf die Datei zugreifen, weil ein anderer Prozess vorhanden ist einen Teil der Datei gesperrt ". Das ist error 33 oder ich denke HResult 0x80070021. [EDIT. Ich glaube, das zurückgeführt werden kann, wenn ein anderer Prozess LockFileEx Anrufe innerhalb einer Datei ein Byte-Bereich sperren]
Ich möchte anhalten und wiederholen, wenn ich diesen Fehler. Ich denke, dies ist die geeignete Maßnahme, die hier zu treffen ist. Wenn der Sperrvorgang die Bytebereichssperre schnell freigibt, kann ich mit dem Lesen der Datei fortfahren.
Wie kann ich eine IOException aus diesem Grund von anderen unterscheiden? Ich kann an diese Möglichkeiten denken:
- private Reflexion - will das nicht tun. Perf wird stinken.
- Aufruf Exception.ToString() und analysieren Sie die Zeichenfolge. Fühlt sich hacky an. Funktioniert nicht in i18n-Versionen.
Ich mag diese Optionen nicht. Gibt es keinen besseren, saubereren Weg?
Ich habe gerade gesucht und System.Runtime.InteropServices.Marshal.GetHRForException gefunden. Wird das eine URL wie 0x80070021 zurückgeben?
> Private Reflexion - tun Sie das nicht tun wollen. Perf wird stinken. - Exception perf stinkt sowieso, also würde ich mir über den Perfaspekt keine Sorgen machen. Reflection erfordert jedoch FullTrust, ist hässlich und nicht unterstützt und anfällig für Bruch - weshalb sollten Sie es nicht tun. –