.NET标准是否将其支持的每个平台上的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;
    }
}

根据MSDN的说法,Hresult值源自COM,这似乎表明它仅在Windows上起作用,并且专门将它们列为" Win32代码"。但这是一个针对.NET标准的库中,理想情况下它应该在每个平台上使用.NET标准支持。

我想知道的是,我是否可以依靠上述方法使用hresult的值为跨平台?文档在这一点上尚不清楚。

如果没有,我如何确定其他平台上要期望的值什么?

注意:有一个类似的问题。net定义了常见的hresult值?,但是在.NET标准(以及对.NET的跨平台支持)之前询问它,所以我不能依靠出于此目的的答案。

目前,我们的代码库仅使用:

  1. 0x00000020- error_sharing_violation
  2. 0x00000021- error_lock_violation
  3. 0x00000050 -error_file_exists

我们是针对.NET标准1.5。

注意:虽然被接受的答案确实满足了我在这里要求的内容,但我有一个后续问题,我该如何使catch genering generic ioeExceptions可靠地跨平台可靠地携带?

异常。验证值不是在平台上标准化的。

对于I/O错误,.NET CORE将以HRESULT返回平台特定的错误代码。示例中已经存在的hresult属性的值在linux上为17,对于其他Unix系统可能是不同的值。

将IO错误映射到Unix上的异常的相关代码在这里:https://github.com/dotnet/corefx/corefx/blob/master/src/src/common/src/src/interop/interop/interop/interop.ioererors.ioerrors.cscspet/p>

相关内容

  • 没有找到相关文章

最新更新