我正在创建一个简单的函数,用于创建随机文件。为了线程安全,它会在重试循环中创建文件,如果文件已存在,则会再次尝试。
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 codes”。但是由于该库面向.NET Standard,最理想的情况是它可以在所有.NET Standard支持的平台上运行。
我想知道的是,我是否可以依赖上述使用HResult值的方法实现跨平台?文档对此并不清楚。
如果不能,那么我应该如何确定在其他平台上能够预期哪些HResult值?
目前,我们的代码库只使用以下值:注意:虽然有类似的问题“.NET定义了常见的HRESULT值吗?”,但它是在.NET Standard(以及.NET的跨平台支持)存在之前提出的,因此我无法依靠该答案来回答这个问题。
- 0x00000020 - ERROR_SHARING_VIOLATION
- 0x00000021 - ERROR_LOCK_VIOLATION
- 0x00000050 - ERROR_FILE_EXISTS
注意:虽然接受的答案确实满足了我在这里提出的问题,但我有一个后续问题“如何使捕获通用IOException在不同平台上都可靠?”
ERROR_SHARING_VIOLATION
和ERROR_LOCK_VIOLATION
是否跨平台吗?我尝试分析了您提供的代码,但似乎找不到定义这些常量的实际位置。我们有一个效率较低的后备实现,但我宁愿不使用它或者仅在不太流行的平台上使用它。 - NightOwl888