Ich erstelle eine einfache Funktion, die eine zufällige Datei erstellt. Um Thread-sicher zu sein, erstellt es die Datei in einer Wiederholungsschleife und wenn die Datei existiert, wird es erneut versucht.Normiert .NET Standard HResult-Werte für jede Plattform, die es unterstützt?
while (true)
{
fileName = NewTempFileName(prefix, suffix, directory);
if (File.Exists(fileName))
{
continue;
}
try
{
// Create the file, and close it immediately
using (var stream = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write, FileShare.Read))
{
break;
}
}
catch (IOException e)
{
// If the error was because the file exists, try again
if ((e.HResult & 0xFFFF) == 0x00000050)
{
continue;
}
// else rethrow it
throw;
}
}
Laut MSDN wird der HResult Wert von COM abgeleitet, die es nur auf Windows, um anzuzeigen scheint, wird funktionieren, und es specifically lists them as "Win32 codes". Aber das ist in einer Bibliothek, die .NET Standard zielt und im Idealfall sollte es auf every platform .NET Standard supports arbeiten.
Ich frage mich, ob ich mich auf den obigen Ansatz verlassen kann, der den Wert von HResult verwendet, um plattformübergreifend zu sein? Die documentation ist in diesem Punkt nicht klar.
Wenn nicht, wie ermittle ich, welche HResult-Werte auf anderen Plattformen zu erwarten sind?
HINWEIS: Es gibt eine ähnliche Frage Does .NET define common HRESULT values?, aber es wurde gefragt, bevor .NET Standard (und plattformübergreifende Unterstützung für .NET) existiert, so kann ich nicht für diesen Zweck auf dieser Antwort verlassen.
Vorerst unsere Codebasis verwendet nur:
- 0x00000020 - ERROR_SHARING_VIOLATION
- 0x00000021 - ERROR_LOCK_VIOLATION
- 0x00000050 - ERROR_FILE_EXISTS
Wir zielen .NET Standard-1.5.
HINWEIS: Während die akzeptierte Antwort nicht erfüllt, was ich hier gefragt, ich habe eine weitere Frage How do I make catching generic IOExceptions reliably portable across platforms?
Ich denke, Sie präziser über das Szenario oder spezifische Fehlercodes, die Sie sich verlassen wollen sein müssen .. Es gibt viele Orte Listen wurden Es werden vordefinierte Codes verwendet (Sie können sowohl im CoreCLR als auch im Fullfx Referenzquellcode nach 'hresults.cs' suchen) und in einigen Fällen gibt es Normalisierungsfunktionen [wie diese für Dateifehler] (https://github.com/dotnet) /coreclr/blob/5c07c5aa98f8a088bf25099f1ab2d38b59ea5478/src/pal/src/file/file.cpp#L184-L194). –
Danke Martin. Ich fügte die 3 Fehler hinzu, die mich derzeit interessieren. War aber irgendwie auf eine allgemeinere Antwort gehofft. Im Allgemeinen sind wir jedoch nur an Datei-IO-Fehlern interessiert. – NightOwl888
Möglicherweise möchten Sie anstelle von msdn eine Verbindung zu [dieser Dokumentation] (https://docs.microsoft.com/en-us/dotnet/api/system.exception.hresult?view=netstandard-1.5) herstellen die offiziellen .net Standard 1.5 API Dokumente. (Ziemlich sicher, dass es ein Kopieren und Einfügen des MSDN ist, aber es ist gut, auf den richtigen Punkt zu zeigen) –