Создать файл только в том случае, если он не существует

Я хочу создать файл ТОЛЬКО, если он еще не существует.
Код вроде:

if (!File.Exists(fileName))
{
    fileStream fs = File.Create(fileName);
}

Оставьте его открытым для состояния гонки, если файл будет создан между "if" и "create".

Как я могу избежать этого?

EDIT:
блокировки не могут использоваться здесь, потому что это разные процессы (несколько экземпляров одного и того же приложения).

Ответ 1

Ответ Кристиана Фенна был почти тем, что мне нужно, только с другим FileMode. Это то, что я искал:

FileStream fs = new FileStream(fileName, FileMode.CreateNew);

Ответ 2

Вы также можете использовать

FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate);

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

Ответ 3

Разве это не лучшее решение. Также обратите внимание на using(var stream...) Используйте его, чтобы закрыть поток, чтобы избежать исключений IO.

if (!File.Exists(filePath))
{
    using (var stream = File.Create(filePath)) { }
}

Ответ 4

Если попытки создания файла находятся в одном процессе, вы можете использовать оператор lock вокруг вашего кода, чтобы предотвратить конфликт.

Если нет, иногда вы можете получить исключение при вызове File.Create. Просто соответствуйте этому исключению. Проверка того, существует ли файл перед созданием, вероятно, рекомендуется, даже если вы обрабатываете исключение, когда файл существует, потому что брошенное исключение относительно дорого. Было бы нецелесообразно, только если вероятность состояния гонки низкая.

Ответ 5

Сначала вы блокируете или Monitor.Enter или TryEnter API, чтобы заблокировать часть кода. Во-вторых, вы можете использовать FileStream API с API FileMode.OpenOrCreate. Если файл существует, он просто использует его, иначе он просто создает его.