web-dev-qa-db-fra.com

Fermer un fichier après File.Create

Je vérifie si un fichier existe avec

if(!File.Exists(myPath))
{
    File.Create(myPath);
}

Cependant, lorsque je crée un StreamReader avec ce fichier nouvellement créé, un message d'erreur s'affiche:

Le processus ne peut pas accéder au fichier '[mon chemin de fichier ici]' car il est utilisé par un autre processus.

Je ne peux pas appeler File.Close(myPath) pour qu'il soit fermé après sa création. Comment libérer cette ressource afin de pouvoir l'ouvrir ultérieurement dans mon programme?

72
John

File.Create(string) renvoie une instance de la classe FileStream class . Vous pouvez appeler la méthode Stream.Close() sur cet objet afin de le fermer et de libérer les ressources qu'il utilise:

var myFile = File.Create(myPath);
myFile.Close();

Cependant, comme FileStream implémente IDisposable , vous pouvez tirer parti de l’instruction using (généralement le moyen préféré de gérer une situation comme celle-ci). Cela garantira que le flux est fermé et éliminé correctement lorsque vous avez terminé:

using (var myFile = File.Create(myPath))
{
   // interact with myFile here, it will be disposed automatically
}
143
Donut

La fonction retourne un objet FileStream. Vous pouvez donc utiliser sa valeur de retour pour ouvrir votre StreamWriter ou le fermer en utilisant la méthode appropriée de l'objet:

File.Create(myPath).Close();
46
Mario

File.Create Renvoie un objet FileStream sur lequel vous pouvez appeler Close() on.

4

La raison en est qu'un FileStream est renvoyé par votre méthode pour créer un fichier. Vous devez renvoyer le FileStream dans une variable ou appeler la méthode close directement après la File.Create.

Il est recommandé de laisser le bloc using vous aider à implémenter le modèle IDispose pour une tâche comme celle-ci. Peut-être que ce qui pourrait fonctionner mieux serait:

if(!File.Exists(myPath)){
   using(FileStream fs = File.Create(myPath))
   using(StreamWriter writer = new StreamWriter(fs)){
      // do your work here
   }
}
3
t3rse
File.WriteAllText(file,content)

créer une écriture proche

File.WriteAllBytes--   type binary

:)

2
danis