4
votes

C # ne peut pas accéder au fichier immédiatement après sa création

J'ai un scénario dans lequel je dois vérifier si un fichier txt existe, si ce n'est pas le cas, je dois le créer.

Immédiatement après cela, je dois remplir le fichier avec du texte.

Voici à quoi ressemble mon code:

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

using (var streamWriter = File.AppendText(_filePath))
{
    //Write to file
}

Je reçois une exception ( System.IO.IOException ) à la ligne 5, uniquement lorsque un nouveau fichier doit être créé. Voici l'exception:

Le processus ne peut pas accéder au fichier '** chemin du fichier expurgé **' car il est utilisé par un autre processus.

Je ne veux pas ajouter quelque chose comme Thread.Sleep (1000); , car c'est une mauvaise solution.

Existe-t-il un moyen de savoir quand le fichier est gratuit encore une fois, pour que je puisse y écrire?


5 commentaires

Utilisez File.Create (_filePath) .Close (); . File.Create () retourne un fichier ouvert qui ne sera pas fermé tant que son finaliseur ne sera pas exécuté comme effet secondaire du garbage collection, sauf si vous le fermez explicitement. Mais vous ne devriez pas avoir besoin de le créer séparément comme ça.


Pourquoi créer le fichier? Crée un StreamWriter qui ajoute du texte encodé en UTF-8 à un fichier existant ou à un nouveau fichier si le fichier spécifié n'existe pas.


Vous devez fermer le flux de fichiers après la création ou écrire immédiatement, comme dans msdn


@PavelAnikhouski L'instruction using fermera et supprimera le streamwriter.


File.Create crée un fichier et ouvre un flux. Utilisez ce flux avec StreamWriter ou utilisez File.AppendText sans File.Create


3 Réponses :


7
votes

Utilisez simplement StreamWriter avec le paramètre append = true . Il créera le fichier si nécessaire.

using (StreamWriter sw = new StreamWriter(_filePath, true, Encoding.Default))
{
   sw.WriteLine("blablabla");
}


2 commentaires

En fait, OP peut simplement utiliser le code qu'il a déjà - File.AppendText () créera le fichier s'il n'existe pas. Ils ont juste besoin de supprimer le code File.Create () et tout ira bien.


Matthew Watson, définitivement)



4
votes

Vous étiez si proche, supprimez simplement le premier if , le File.AppendText fera l'affaire pour vous et créera le fichier sinon.

using (var streamWriter = File.AppendText(_filePath))
{
    //write to file
}


0 commentaires

2
votes

La méthode FileCreate renvoie Filestream qui doit être fermée avant d'utiliser StreamWriter

if (!File.Exists(_filePath))
{
// close fileStream
    File.Create(_filePath).Close();
}

using (var streamWriter = File.AppendText(_filePath))
{
    //Write to file
}


0 commentaires