【问题标题】:What's the best way to get the name of a folder that doesn't exist?获取不存在的文件夹名称的最佳方法是什么?
【发布时间】:2010-09-13 23:00:25
【问题描述】:

获取包含我可以确定 存在的文件夹名称的字符串的最佳方法是什么?也就是说,如果我为给定的路径调用 DirectoryInfo.Exists,它应该返回 false。

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

【问题讨论】:

  • 你想要一些随机的名字吗?临时文件夹?否则我得不到你想要的:)

标签: c# directory


【解决方案1】:

以 GUID 命名 - 只需去掉非法字符。

【讨论】:

  • guid 是否包含任何非法字符?我刚看了看,好像没有。
【解决方案2】:

实际上没有任何方法可以精确地按照您想要的方式做。如果您考虑一下,您会发现即使在对 DirectoryInfo.Exists 的调用返回 false 之后,其他程序也可能继续创建目录 - 这是一个竞争条件。

处理此问题的常规方法是创建一个新的临时目录 - 如果创建成功,那么您知道它在创建之前不存在。

【讨论】:

    【解决方案3】:

    好吧,如果不创建目录,您可以确定的是它在几微秒前还不存在。这是一种可能足够接近的方法:

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

    请注意,这会创建目录以阻止线程竞争(即另一个进程/线程从您下面窃取目录)。

    【讨论】:

    • 这会得到一个临时文件夹的路径,但如果 krolley 想要一些持久的东西,这将不起作用。
    • 是的 - 但如果没有更多上下文,很难知道这是好事还是坏事。实际上,我喜欢 jop 的 Guid 建议 - 如果我能修复我的 openid,我会“升级”它;-p
    • AFAIK,在 Windows 中,现在可以将多个操作包装在单个原子事务中。所以这个问题真的没有绝对的答案。我们所拥有的只是“足够好”的答案。
    【解决方案4】:

    我最终使用了什么:

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

    (此外,您似乎不需要从 guid 中删除字符 - 它们会生成合法的文件名)

    【讨论】:

      【解决方案5】:

      嗯,一个不错的选择是将用户名、今天的日期和时间等字符串连接到毫秒。

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          我认为你可以足够接近:

          string directoryName = Guid.NewGuid.ToSrtring();

          因为 Guid 是相当随机的,所以你不应该得到 2 个相同的目录。

          【讨论】:

          • 让您想知道是否有 SO 机器人回答这些快速简单的问题。 :)
          • matt 认为 jop 实际上是一个机器人 ;)
          • 相当随机 我猜是描述 Guid 的一种方式...我想这取决于您希望系统运行多少个宇宙生命为!
          【解决方案8】:

          在同样有些独特的命名空间中使用新生成的 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);
          

          【讨论】:

            猜你喜欢
            • 2010-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多