【问题标题】:Get unique filename in a multithreaded application在多线程应用程序中获取唯一文件名
【发布时间】:2010-07-02 09:41:04
【问题描述】:

我需要在一个多线程应用程序中构建一个唯一的文件名,该应用程序正在序列化磁盘上的一些数据。 我可以使用什么方法来确保名称的唯一性。 该应用程序以前不是多线程的,而是使用 Ticks。使用多个线程时,它失败的速度比我预期的要快得多。 我现在将 CurrentThreadId 添加到文件名中,应该这样做

string.Format("file_{0}_{1}.xml", DateTime.Now.Ticks, Thread.CurrentThread.ManagedThreadId)

有什么“更聪明”的方法吗?

【问题讨论】:

    标签: c# multithreading file unique


    【解决方案1】:

    Guid.NewGuid() 而不是线程 id 呢?

    string.Format("file_{0}_{1:N}.xml", DateTime.Now.Ticks, Guid.NewGuid()) 
    

    通过保留刻度作为名称的一部分,如果排序很重要,名称仍将按大致日期顺序排列。

    {1:N} 去掉了 guid 中的花括号和破折号。

    另外,考虑使用 DateTime.UtcNow.Ticks,以保证夏令时开始时的增量滴答。

    【讨论】:

    • 谢谢 我不确定 Guid 跨线程的唯一性。我以为他们是用当前时间腌制的,这对跨线程没有帮助
    • 你是对的 - 时间戳是 Guid 的主要组成部分,但该算法还维护自己的唯一计数器来处理“同时”请求。算法的简单分解在这里:blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx
    【解决方案2】:

    根据您的需要,您可以尝试:

    System.IO.Path.GetTempFileName();

    这会在 %temp% 目录中创建一个唯一命名的临时文件。我想您可以在写入文件之前或之后将文件复制到目标位置。

    【讨论】:

    • 这只能保证文件名在临时目录中是唯一的 - 而不是在 OP 的目标位置。
    【解决方案3】:

    要实际保留文件名,您必须立即创建文件并检查异常情况。

    另一种选择是在文件名中包含 Guid 值。

    【讨论】:

      【解决方案4】:

      怎么样

      Guid.NewGuid().ToString()
      

      【讨论】:

        猜你喜欢
        • 2023-04-10
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 2019-05-19
        • 2011-12-28
        • 1970-01-01
        • 2013-02-13
        • 2012-12-14
        相关资源
        最近更新 更多