141 votes

Fichier utilisé par un autre processus après avoir utilisé File.Create()

J'essaie de détecter si un fichier existe au moment de l'exécution, si non, le créer. Cependant, j'obtiens cette erreur lorsque j'essaie d'écrire dans le fichier :

Le processus ne peut pas accéder au fichier 'myfile.ext' car il est utilisé par un autre processus.

string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre); 
if (!File.Exists(filePath)) 
{ 
    File.Create(filePath); 
} 

using (StreamWriter sw = File.AppendText(filePath)) 
{ 
    //write my text 
}

Des idées sur la façon de le réparer ?

172voto

    File.Create(FilePath).Close();
    File.WriteAllText(FileText);

Je souhaite mettre à jour cette réponse pour dire que ce n'est pas vraiment la manière la plus efficace d'écrire tout le texte. Vous ne devriez utiliser ce code que si vous avez besoin de quelque chose de rapide et sale.

J'étais un jeune programmeur lorsque j'ai répondu à cette question, et à l'époque, je me prenais pour une sorte de génie pour avoir trouvé cette réponse.

4 votes

J'adore le fait que toutes les autres réponses étaient trop compliquées. Les gens ne réalisent pas qu'il y a une réponse plus simple à chaque problème.

16 votes

L'inconvénient de ce code est qu'il ouvre inutilement le fichier deux fois. De plus, il n'est pas vraiment nécessaire de vérifier si le fichier existe, car le constructeur de FileStream le créera automatiquement s'il n'existe pas, sauf si vous lui demandez explicitement de ne pas le faire.

2 votes

@reirab C'est complètement relatif. J'ai besoin de vérifier si le fichier existe et si c'est le cas, le supprimer et le recréer, donc cette réponse est préférable dans mon cas.

130voto

Chris Dunaway Points 3880

Le site File.Create crée le fichier et ouvre un FileStream sur le fichier. Donc votre fichier est déjà ouvert. Vous n'avez pas vraiment besoin de la méthode file.Create :

string filePath = @"c:\somefilename.txt";
using (StreamWriter sw = new StreamWriter(filePath, true))
{
    //write to the file
}

Le booléen dans le StreamWriter Le constructeur fera en sorte que le contenu soit ajouté si le fichier existe.

0 votes

J'ai essayé le code ci-dessus mais j'obtiens la même erreur quand le fichier est créé et quand il essaie d'écrire dans le fichier il montre que le fichier est utilisé par un autre processus.

1 votes

@AnmolRathod assurez-vous que vous n'utilisez pas File.Create() méthode ! Le snippet ci-dessus crée déjà le fichier !

27voto

Ralf de Kleine Points 5476

Lors de la création d'un fichier texte, vous pouvez utiliser le code suivant :

System.IO.File.WriteAllText("c:\test.txt", "all of your content here");

En utilisant le code de votre commentaire. Le fichier(flux) que vous avez créé doit être fermé. File.Create renvoie le filestream vers le fichier qui vient d'être créé.. :

string filePath = "filepath here";
if (!System.IO.File.Exists(filePath))
{
    System.IO.FileStream f = System.IO.File.Create(filePath);
    f.Close();
}
using (System.IO.StreamWriter sw = System.IO.File.AppendText(filePath))
{ 
    //write my text 
}

0 votes

Je n'ai pas l'impression d'avoir une option proche. Voici le code : string filePath = string.Format(@"{0} \M {1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre) ; if (!File.Exists(filePath)) { File.Create(filePath) ; } using (StreamWriter sw = File.AppendText(filePath)) { //écrit mon texte }.

0 votes

File.Create renvoie à FileStream et qui a Close()

15voto

user3430377 Points 61
FileStream fs= File.Create(ConfigurationManager.AppSettings["file"]);
fs.Close();

8 votes

Bienvenue à Stackoverflow. Vous devriez au moins écrire une courte description de votre réponse/solution.

9voto

kimtiede Points 127

File.Create renvoie un FileStream. Vous devez le fermer lorsque vous avez écrit dans le fichier :

using (FileStream fs = File.Create(path, 1024)) 
        {
            Byte[] info = new UTF8Encoding(true).GetBytes("This is some text in the file.");
            // Add some information to the file.
            fs.Write(info, 0, info.Length);
        }

Vous pouvez utiliser utiliser pour fermer automatiquement le fichier.

0 votes

Bien que l'OP essaie d'ouvrir un StreamWriter comme on peut le déduire de son utilisation de File.AppendText .

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