已经存在的文件系统.IO.Path.GetRandomFileName()的概率



最近我得到了异常:

Message:
System.IO.IOException: The file 'C:WindowsTEMP635568456627146499.xlsx' already exists.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

这是我用于生成文件名的以下代码的结果:

Path.Combine(Path.GetTempPath(), DateTime.Now.Ticks + ".xlsx");

在意识到可以在一个 Tick 中创建两个文件后,我将代码更改为:

Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".xlsx");

但我仍然想知道在新情况下上述例外的概率是多少?

在内部,GetRandomFileName 使用 RNGCryptoServiceProvider 生成 11 个字符(名称:8+ext:3)的字符串。字符串表示以 32 为基数的编码数字,因此可能的字符串总数为 32112 55

假设分布均匀,复制的几率约为 2-55,或 36 千万亿分之一。这是相当低的:相比之下,您赢得纽约乐透的机会大约高出一百万倍。

使用 GetRandom文件名获取重复名称的概率非常低,但如果您在此处查看源代码,您会发现它们不会检查名称是否重复(他们不能,因为您无法告诉应该创建此文件的路径)

相反,Path.GetTempFileName 返回 Temp 目录中的唯一文件名。
(因此也无需在代码中构建临时路径)
GetTempFileName 使用 Win32 API GetTempFileName请求创建唯一的文件名。
Win32 API 创建长度为零的文件并释放句柄。因此,您不会陷入并发方案。最好使用这个。

GetRandomFileName() 返回 8.3 个字符的字符串。这是 11 个字符,可能会有所不同。假设它只包含字母和数字,这给了我们一个 36 个字符的"字母表"。所以变异的数量最少是 36^11,这使得上述异常的概率极低。

我想把我的答案放在评论区而不是这里,但我没有足够的声誉来添加评论。

对于您的第一个代码段,我认为您可以预先检查文件是否存在。

对于第二个,代码将生成随机名称,但随机意味着您仍然有很小的可能性获得异常。但我认为你不需要担心这个。存在检查会有所帮助。

相关内容

  • 没有找到相关文章

最新更新