【发布时间】:2010-09-13 23:00:25
【问题描述】:
获取包含我可以确定 不 存在的文件夹名称的字符串的最佳方法是什么?也就是说,如果我为给定的路径调用 DirectoryInfo.Exists,它应该返回 false。
编辑:背后的原因是我正在为错误检查器编写测试,错误检查器测试路径是否存在,所以我想知道获得不存在路径的最佳方法。
【问题讨论】:
-
你想要一些随机的名字吗?临时文件夹?否则我得不到你想要的:)
获取包含我可以确定 不 存在的文件夹名称的字符串的最佳方法是什么?也就是说,如果我为给定的路径调用 DirectoryInfo.Exists,它应该返回 false。
编辑:背后的原因是我正在为错误检查器编写测试,错误检查器测试路径是否存在,所以我想知道获得不存在路径的最佳方法。
【问题讨论】:
以 GUID 命名 - 只需去掉非法字符。
【讨论】:
实际上没有任何方法可以精确地按照您想要的方式做。如果您考虑一下,您会发现即使在对 DirectoryInfo.Exists 的调用返回 false 之后,其他程序也可能继续创建目录 - 这是一个竞争条件。
处理此问题的常规方法是创建一个新的临时目录 - 如果创建成功,那么您知道它在创建之前不存在。
【讨论】:
好吧,如果不创建目录,您可以确定的是它在几微秒前还不存在。这是一种可能足够接近的方法:
string path = Path.GetTempFileName();
File.Delete(path);
Directory.CreateDirectory(path);
请注意,这会创建目录以阻止线程竞争(即另一个进程/线程从您下面窃取目录)。
【讨论】:
我最终使用了什么:
using System.IO;
string path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
(此外,您似乎不需要从 guid 中删除字符 - 它们会生成合法的文件名)
【讨论】:
嗯,一个不错的选择是将用户名、今天的日期和时间等字符串连接到毫秒。
不过我很好奇:你为什么要这样做?应该是干什么用的?
【讨论】:
这是创建一个临时文件夹还是什么?我经常使用 Guid.NewGuid 来获取一个字符串,用于您要确定的文件夹名称不存在。
【讨论】:
我认为你可以足够接近:
string directoryName = Guid.NewGuid.ToSrtring();
因为 Guid 是相当随机的,所以你不应该得到 2 个相同的目录。
【讨论】:
在同样有些独特的命名空间中使用新生成的 GUID(例如,您的应用程序/产品的名称)应该可以满足您的需求。例如,以下代码极不太可能失败:
string ParentPath = System.IO.Path.Combine(Environment.GetEnvironmentVariable("TEMP"), "MyAppName");
string UniquePath = System.IO.Path.Combine(ParentPath, Guid.NewGuid().ToString());
System.IO.Directory.CreateDirectory(UniquePath);
【讨论】: