ランダムなファイルを作成する単純な関数を作成しています。スレッドセーフであるために、再試行ループでファイルを作成し、ファイルが存在する場合は再試行します。 MSDNによると、HRESULT値は、それはWindowsでのみ動作し、それspecifically lists them as "Win32 codes"ますを示しているように思われるCOMから派生し.NET StandardはサポートするすべてのプラットフォームでHResult値を正規化しますか?
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;
}
}
。しかし、これは.NET Standardをターゲットとするライブラリにあり、理想的にはevery platform .NET Standard supportsで動作するはずです。
私が考えているのは、HResultの値をクロスプラットフォームに使用する上記のアプローチに頼ることができるかどうかです。この時点でdocumentationは不明です。
もしそうでなければ、他のプラットフォームで期待されるHResult値はどのようにして決定されますか?
注:あり同様の質問Does .NET define common HRESULT values?があるが、それは、.NETの標準(および.NETのためのクロスプラットフォームサポート)の前に頼まれたが存在していたので、私は、この目的のためにその答えに頼ることはできません。 ERROR_SHARING_VIOLATION
0x00000021 - - ERROR_LOCK_VIOLATION 0x00000050を -
- 0x00000020我々は、.NETの標準1.5をターゲットにしている
をERROR_FILE_EXISTS:
今のところ、私たちのコードベースにのみ使用します。
注:受け入れ答えは、私がここで尋ね満たさんが、私はHow do I make catching generic IOExceptions reliably portable across platforms?
私は多くの場所があります..あなたは、あなたが頼りにしたいシナリオや特定のエラーコードについてより具体的でなければならないと思いリストでした(CoreCLRとfullfx参照ソースコードの両方で 'hresults.cs 'を検索することができます)、場合によってはファイルエラーのような正規化関数があります(https://github.com/dotnet /coreclr/blob/5c07c5aa98f8a088bf25099f1ab2d38b59ea5478/src/pal/src/file/file.cpp#L184-L194)。 –
Martinに感謝します。私は現在私が興味を持っている3つのエラーを追加しました。もっと一般的な答えがほしいと思っていました。一般に、私たちはファイルIOエラーにしか関心がありません。 – NightOwl888
msdnの代わりに[このドキュメント](https://docs.microsoft.com/en-us/dotnet/api/system.exception.hresult?view=netstandard-1.5)にリンクしたい場合があります公式の.net標準の1.5 APIドキュメント。 (かなりMSDNのコピー&ペーストですが、正しい場所を指すのが良いです) –