【问题标题】:Ensure new directory created确保创建新目录
【发布时间】:2016-11-15 19:59:02
【问题描述】:

我需要在多线程应用程序的文件夹中创建目录。 每个会话的目录必须是唯一的。

现在通过创建文件,您可以使用以下内容,以确保当前线程创建了文件。

New FileStream(FilePath, FileMode.CreateNew)

如果文件已经存在,FileMode.CreateNew 会给出异常。

我可以做到以下几点。但是如果 2 个线程试图同时创建同一个目录。 他们现在将收到相同的路径。因为如果目录已经存在,Directory.CreateDirectory 不会抛出异常。

    If Not Directory.Exists(DirPath) Then
        Directory.CreateDirectory(DirPath)
    End If

.NET4 对此有解决方案吗?

【问题讨论】:

  • 如何生成'FilePath'?
  • 那将是:RootDir + UserName + Timestamp。它应该是独一无二的。但如果它不是唯一的,我想要一个故障回复。
  • 如果您只需要检查同一进程的线程之间是否可以使用lock/SyncLock 包装操作
  • 你为什么想要一个“解决方案”?目录是可共享的,不管是哪个线程创建的。
  • 那么每个会话应该使用一个唯一的名称。问题应该不会发生。

标签: .net multithreading system.io.directory


【解决方案1】:

您可以使用全局计数器作为目录路径的一部分:

private static long counter = 0L;

var n = Interlocked.Increment(ref counter);
var path = 
    Path.Combine(
        root,
        Environment.MachineName, 
        n.ToString(CultureInfo.InvariantCulture), 
        "whatever", "else");

【讨论】:

  • 多线程应用程序位于 IIS 中,来自多个应用程序服务器。因此在这种情况下可以使用“锁定”机制。
  • @Stinus 多个应用服务器是指多个物理(或虚拟)服务器?如果是这种情况,他们可能使用本地文件系统,所以这个解决方案可以正常工作。
  • 可能是多个物理或虚拟服务器。取决于哪个客户。 “RootDir”位于网络存储上。所以可以在任何地方。但它是多个服务器/线程的 1 个目录。
  • @Stinus 然后把Environment.MachineName 推到某个地方——这些应该是非常独特的。
猜你喜欢
  • 1970-01-01
  • 2014-05-27
  • 2021-10-29
  • 1970-01-01
  • 2017-02-01
  • 2014-01-05
  • 2013-07-18
  • 1970-01-01
相关资源
最近更新 更多