2017-09-23 7 views
8

ランダムなファイルを作成する単純な関数を作成しています。スレッドセーフであるために、再試行ループでファイルを作成し、ファイルが存在する場合は再試行します。 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を -

    1. 0x00000020我々は、.NETの標準1.5をターゲットにしている

    をERROR_FILE_EXISTS:

  • 今のところ、私たちのコードベースにのみ使用します。

    注:受け入れ答えは、私がここで尋ね満たさんが、私はHow do I make catching generic IOExceptions reliably portable across platforms?

    +0

    私は多くの場所があります..あなたは、あなたが頼りにしたいシナリオや特定のエラーコードについてより具体的でなければならないと思いリストでした(CoreCLRとfullfx参照ソースコードの両方で 'hresults.cs 'を検索することができます)、場合によってはファイルエラーのような正規化関数があります(https://github.com/dotnet /coreclr/blob/5c07c5aa98f8a088bf25099f1ab2d38b59ea5478/src/pal/src/file/file.cpp#L184-L194)。 –

    +0

    Martinに感謝します。私は現在私が興味を持っている3つのエラーを追加しました。もっと一般的な答えがほしいと思っていました。一般に、私たちはファイルIOエラーにしか関心がありません。 – NightOwl888

    +0

    msdnの代わりに[このドキュメント](https://docs.microsoft.com/en-us/dotnet/api/system.exception.hresult?view=netstandard-1.5)にリンクしたい場合があります公式の.net標準の1.5 APIドキュメント。 (かなりMSDNのコピー&ペーストですが、正しい場所を指すのが良いです) –

    答えて

    7

    Exception.HResult値はプラットフォーム間で標準化されていないフォローアップの質問があります。

    I/Oエラーの場合、.NETコアはプラットフォーム固有のエラーコードをHResultとして返します。あなたのサンプルにすでに存在するファイルのHResultプロパティの値はLinuxでは17になり、他のUnixシステムでは異なる値になる可能性があります。

    のUnix上の例外にIOエラーをマッピングし、関連するコードはここにある:https://github.com/dotnet/corefx/blob/master/src/Common/src/Interop/Unix/Interop.IOErrors.cs

    +0

    ありがとうございます。残念ながら、提供したリンクはコードだけを表示しますが、値を提供するリソースファイルは表示しません。そのディレクトリ内の他のプラットフォームに対応するファイルはないようです。上記のアプローチを信頼できるものにすることはできないのですか?または、すべてのプラットフォームに必要なすべての値を取得する方法がありますか?注:.NET Standard 1.5がサポートするプラットフォームごとに、私の質問には3つのエラーが必要です。 – NightOwl888

    +0

    このアプローチは確実に移植可能にすることはできません。この場合のHResultは、基本となるオペレーティングシステムが返すものです。それはLinux、macOS、FreeBSD、...の間で違います。私はそれを明確にするために投稿を編集します。 –

    関連する問題