已存在文件的概率 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 创建长度为零的文件并释放句柄。
所以你不会陷入并发场景。最好用这个。
最近遇到异常:
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 创建长度为零的文件并释放句柄。
所以你不会陷入并发场景。最好用这个。