web-dev-qa-db-fra.com

Créer un fichier seulement s'il n'existe pas

Je veux créer un fichier SEULEMENT s'il n'existe pas déjà.
Un code comme:

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

Laissez-le ouvert pour une condition de concurrence au cas où le fichier serait créé entre le "if" et le "create". 

Comment puis-je l'éviter?

MODIFIER:
locks ne peut pas être utilisé ici car il s'agit d'un processus différent (plusieurs instances de la même application).

15
Roee Gavirel

La réponse de Kristian Fenn était presque ce dont j'avais besoin, avec juste un FileMode différent. C'est ce que je cherchais:

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

Vous pouvez aussi utiliser 

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

Cependant, vous devriez examiner le verrouillage de thread comme si plusieurs threads essayaient d'accéder au fichier, vous obtiendrez probablement une exception.

21
Kristian Fenn

N'est-ce pas une meilleure solution? Notez également que using(var stream...) Utilisez-le pour fermer le flux afin d'éviter IO Exceptions.

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

Si les tentatives concurrentes de création du fichier suivent le même processus, vous pouvez utiliser une instruction lock autour de votre code pour éviter les conflits.

Sinon, vous pouvez parfois obtenir une exception lorsque vous appelez File.Create. Gérez simplement cette exception. Il est probablement recommandé de vérifier si le fichier existe avant de le créer, même si vous gérez une exception alors que le fichier existe, car une exception levée est relativement coûteuse. Cela ne serait pas souhaitable uniquement si la probabilité de situation de concurrence critique est faible.

0
Eric J.

Commencez par verrouiller la partie du code avec les API Lock ou Monitor.Enter ou TryEnter. Ensuite, vous pouvez utiliser l’API FileStream avec l’API FileMode.OpenOrCreate. Si le fichier existe, il l'utilise ou bien le crée.

0
Zenwalker