2016-07-13 8 views
1

Мне нужно создать каталоги в папке из многопоточного приложения. Каталог должен быть уникальным для каждой сессии.Убедитесь, что создан новый каталог

Теперь с созданием файла вы можете использовать следующее, чтобы убедиться, что текущий поток создал файл.

New FileStream(FilePath, FileMode.CreateNew) 

FileMode.CreateNew дает исключение, если файл уже существует.

Я могу сделать следующее. Но если 2 потока попытаются создать тот же каталог в одно и то же время. Теперь они получат одинаковый путь. Поскольку Directory.CreateDirectory не генерирует исключения, если каталог уже существует.

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

Есть ли у .NET4 решение для этого?

+0

Как вы генерировать «FilePath»? – lenkan

+0

Это будет: RootDir + UserName + Timestamp. Он должен быть уникальным. Но я хочу получить отказ, если он не будет уникальным. – Stinus

+0

Если вам просто нужно проверить, что между потоками одного процесса вы можете выполнить операцию с помощью ['lock'] (https://msdn.microsoft.com/it-it/library/c5kehkcz.aspx)/[' SyncLock' ] (https://msdn.microsoft.com/it-it/library/3a86s51t.aspx) –

ответ

2

Вы можете использовать глобальный счетчик как часть вашего пути к каталогу:

private static long counter = 0L; 

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

Многопоточное приложение находится в IIS, с нескольких серверов приложений. Таким образом, в этой ситуации можно использовать механизм блокировки. – Stinus

+0

@Stinus С помощью нескольких серверов приложений вы имеете в виду несколько физических (или виртуальных) серверов? Если это так, они предположительно используют локальную файловую систему, поэтому это решение будет работать нормально. –

+0

Может быть несколько физических или виртуальных серверов. Зависит от того, какой клиент. «RootDir» находится в сетевом хранилище. Так может быть где угодно. Но это 1 каталог для нескольких серверов/потоков. – Stinus

Смежные вопросы