如何获取不存在文件夹的名称?最佳方法是什么?

3

如何获得一个文件夹名称的字符串,以确保该文件夹不存在?也就是说,如果我对给定路径调用DirectoryInfo.Exists,它应该返回false。

编辑:原因是我正在为错误检查器编写测试,错误检查器测试路径是否存在,因此我想知道获取不存在的路径的最佳方法。


你需要一些随机的名称,例如用于临时文件夹吗?否则我不明白你想要什么 :) - OregonGhost
8个回答

9

将其命名为GUID - 只需删除非法字符即可。


一个 GUID 是否包含任何非法字符?我刚刚查看了一下,似乎没有。 - robertkroll

6

实际上没有一种方法可以精确地做到你想做的事情。如果你仔细思考,你会发现即使在调用DirectoryInfo.Exists返回false之后,其他程序仍然可能会创建目录 - 这是一种竞争条件。

处理这种情况的常规方法是创建一个新的临时目录 - 如果创建成功,则知道它以前不存在。


5

如果没有创建目录,你只能确定它在几微秒前不存在。这里有一种可能足够接近的方法:

        string path = Path.GetTempFileName();
        File.Delete(path);
        Directory.CreateDirectory(path);

请注意,这将创建一个目录以防止线程竞争(即另一个进程/线程从你手中窃取目录)。

这会获取临时文件夹的路径,但如果krolley想要一些持久存在的东西,这样做就不行了。 - Jon Limjap
真的没错 - 但是如果没有更多的上下文,很难知道这是好事还是坏事。实际上,我喜欢jop的Guid建议 - 如果我能修复我的openid,我会“up”它 ;-p - Marc Gravell
据我所知,在Windows中,没有办法将多个操作包装在一个单一的原子事务中。因此,对于这个问题,真正的答案并不存在。我们只有'够好'的答案。 - jop

4
我最终使用的是:
using System.IO;

string path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());

此外,似乎不需要从GUID中去除字符-它们生成合法的文件名。


0

嗯,一个好的选择是将字符串连接起来,例如用户名、今天的日期和毫秒级时间。

不过我很好奇:你为什么想要这样做?它应该是用来做什么的呢?


0

这是用来创建临时文件夹还是其他什么?我经常使用Guid.NewGuid来获取一个字符串,用于文件夹名称,以确保它不存在。


0

我认为你可以足够接近:

string directoryName = Guid.NewGuid.ToSrtring();

由于Guid相当随机,因此您不应该得到两个相同的目录。


让你想知道是否有 Stack Overflow 机器人回答这些快速简单的问题。 :) - jop
马特认为Jop实际上是一个机器人 ;) - mattlant
“相当随机”是描述Guid的一种方式,我猜…我想这取决于您希望系统运行多少个宇宙生命! - Loofer

0

在命名空间中使用新生成的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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接