Создать файл, только если не существует - PullRequest
15 голосов
/ 24 октября 2011

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

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

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

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

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

Ответы [ 5 ]

21 голосов
/ 24 октября 2011

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

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

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

13 голосов
/ 11 декабря 2013

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

FileStream fs = new FileStream(fileName, FileMode.CreateNew);
2 голосов
/ 15 декабря 2017

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

if (!File.Exists(filePath))
{
    using (var stream = File.Create(filePath)) { }
}
0 голосов
/ 24 октября 2011

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

0 голосов
/ 24 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...