Bonne façon d’attendre la création d’un fichier

J’ai le code suivant:

// get location where application data director is located var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); // create dir if it doesnt exist var folder = System.IO.Path.Combine(appData, "SomeDir"); if (System.IO.Directory.Exists(folder) == false) System.IO.Directory.CreateDirectory(folder); // create file if it doesnt exist var file = System.IO.Path.Combine(folder, "test.txt"); if(System.IO.File.Exists(file)== false) System.IO.File.Create(file); // write something to the file System.IO.File.AppendAllText(file,"Foo"); 

Ce code se bloque sur la dernière ligne ( An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll ). Si je mets un Thread.Sleep(400) après la création du fichier, le code fonctionne très bien. Quelle est la bonne façon d’attendre la création du fichier?

PS j’utilise .net framework 3.5

Même si j’attends ça plante: /

entrez la description de l'image ici

La raison en est que File.Create est déclaré comme:

 public static FileStream Create( ssortingng path ) 

Il retourne un FileStream . La méthode est supposée être utilisée pour créer et ouvrir un fichier en écriture. Étant donné que vous ne supprimez jamais l’object FileStream renvoyé, vous placez essentiellement vos paris sur le ramasse-miettes pour collecter cet object avant que vous n’ayez besoin de réécrire le fichier.

Donc, pour résoudre le problème avec la solution naïve, vous devez vous débarrasser de cet object:

 System.IO.File.Create(file).Dispose(); 

Maintenant, il faut savoir que File.AppendAllText créera le fichier s’il n’existe pas et que vous n’avez même pas besoin de ce code. Voici votre code complet avec le code inutile supprimé:

 // get location where application data director is located var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); // create dir if it doesnt exist var folder = System.IO.Path.Combine(appData, "SomeDir"); System.IO.Directory.CreateDirectory(folder); // write something to the file var file = System.IO.Path.Combine(folder, "test.txt"); System.IO.File.AppendAllText(file,"Foo"); 

Directory.CreateDirectory ne tombera pas en panne si le dossier existe déjà, vous pouvez donc l’appeler en toute sécurité.

Il n’est pas nécessaire de créer le fichier si vous envisagez d’utiliser File.AppendAllText

À propos de la cause première de l’erreur et de la méthode préférée pour écrire dans les fichiers en général:

Le fichier a été créé et a renvoyé un stream que vous n’avez pas utilisé / close. La meilleure méthode consiste à utiliser ce stream pour écrire dans le fichier.

 using (FileStream fs = File.Create(file)) { fs.Write("What ever you need to write.."); }