已存在文件的概率 System.IO.Path.GetRandomFileName()

Probability of already existing file System.IO.Path.GetRandomFileName()

最近遇到异常:

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

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

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

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

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

但我还是想知道在新的情况下出现上述异常的概率是多少?

GetRandomFileName() returns 8.3 字符字符串。这是 11 个可以变化的字符。假设它只包含字母和数字,这给了我们 36 个字符的 "alphabet"。所以变化的数量最少36^11,这使得上述异常的概率极低。

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

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

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

在内部,GetRandomFileName 使用 RNGCryptoServiceProvider 生成 11 个字符 (name:8+ext:3) 的字符串。该字符串表示 base-32 编码的数字,因此可能的字符串总数为 3211 或 255.

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

使用 GetRandomFileName 获得重复名称的可能性非常低,但如果您查看它 source here,您会发现他们不检查名称是否重复(他们不能,因为您可以'告诉应该创建这个文件的路径)

取而代之的是 Path.GetTempFileName return 一个唯一的文件名 Temp 目录中。
(因此也无需在代码中构建临时路径)
GetTempFileName 使用 Win32 API GetTempFileName 请求创建唯一文件名。
Win32 API 创建长度为零的文件并释放句柄。 所以你不会陷入并发场景。最好用这个。