我正在创建一个创建随机文件的简单函数。为了安全起见,它将在重试循环中创建文件,如果文件存在再次尝试。
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的跨平台支持)之前询问它,所以我不能依靠出于此目的的答案。
目前,我们的代码库仅使用:
- 0x00000020- error_sharing_violation
- 0x00000021- error_lock_violation
- 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>