31 votes

Pourquoi File.Create doit-il être fermé?

Ce qui suit lève une exception " The process cannot access the file 'D:\MyDir\First.txt' because it is being used by another process. "

 static void Main(string[] args)
{
    Directory.CreateDirectory(@"D:\MyDir");
    File.Create(@"D:\MyDir\First.txt");
    File.WriteAllText(@"D:\MyDir\First.txt", "StackOverflow.com");
}
 

Cependant les travaux suivants:

 using (File.Create(@"D:\MyDir\First.txt"))
{ 
}
 

ou

 File.Create(@"D:\MyDir\First.txt").Close();
 

Pourquoi? Que doit-on fermer en File.Create ?

46voto

David Points 65209

File.Create , c'est plus que ce que vous pensez ici. Ce n'est pas seulement de créer le fichier, c'est aussi le retour d'un flux actif pour le fichier. Toutefois, vous ne faites rien avec ce flux. L' using bloc dans votre dernier exemple, ferme le flux de données en disposer.

Notez aussi que c'est un indice révélateur de la valeur de retour:

File.Create(@"D:\MyDir\First.txt").Close();

(En fait, il n'était pas intuitif pour moi quand j'ai lu votre question, mais en regardant en arrière à cette ligne de code en fait tout est dit.)

Votre prochaine étape, appelant File.WriteAllText fait bien plus que vous ne le pensez. Selon la documentation, il:

Crée un nouveau fichier, écrit la chaîne de caractères spécifiée dans le fichier, puis ferme le fichier.

Il semblerait donc que votre File.Create appel n'est pas vraiment nécessaire ici de toute façon.

22voto

Matías Fidemraizer Points 16842

Parce qu’il ouvre un flux de fichiers, qui est une classe qui gère certaines ressources de bas niveau du système d’exploitation, celles-ci doivent être libérées afin de permettre à d’autres opérations, même dans d’autres applications, d’accéder au fichier.

10voto

Dan Diplo Points 16133

La documentation MSDN de File.Create () explique ceci:

L'objet FileStream créé par cette méthode a une valeur FileShare par défaut de None; Aucun autre processus ou code ne peut accéder au fichier créé tant que le descripteur de fichier d'origine n'est pas fermé.

Fondamentalement, tant que le fichier n'est pas fermé, le fichier ne peut pas être consulté par un autre processus (dans ce cas, votre tentative d'écriture).

10voto

Kev Points 60744

Vous n'avez pas besoin d'appeler File.Create() pour pouvoir ensuite appeler File.WriteAllText() .

File.WriteAllText() va créer un nouveau fichier et y écrire, puis fermer le fichier en une seule méthode pratique.

Si le fichier existe déjà, il sera écrasé.

8voto

Jeffrey L Whitledge Points 27574

File.Create(string) renvoie un objet FileStream qui maintient le fichier ouvert. Même si vous ne conservez pas de référence à un objet FileStream dans une variable, celui-ci existe toujours. L'objet est éligible pour la récupération de place, et lorsque cela se produit, le fichier sera fermé, mais il n'y a pas de prédiction quant au moment où la récupération de place aura lieu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X