web-dev-qa-db-fra.com

Fichier utilisé par un autre processus après l'utilisation de File.Create ()

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

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 résoudre ce problème?

98
Brett

La méthode File.Create crée le fichier et ouvre une 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 constructeur StreamWriter provoquera l'ajout du contenu si le fichier existe.

101
Chris Dunaway
    File.Create(FilePath).Close();
    File.WriteAllText(FileText);

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

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

127
Carsen Daniel Yates

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 flux de fichiers au fichier que vous venez de créer:

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 
}
23
Ralf de Kleine
FileStream fs= File.Create(ConfigurationManager.AppSettings["file"]);
fs.Close();
16
user3430377

File.Create renvoie un FileStream. Vous devez fermer ça quand 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 avec pour fermer automatiquement le fichier.

9
kimtiede

J'ai mis à jour votre question avec l'extrait de code. Après un retrait correct, le problème est immédiatement clair: vous utilisez File.Create() mais ne fermez pas la FileStream qu'il renvoie.

Cela est inutile, StreamWriter permet déjà d’ajouter à un fichier existant et de créer un nouveau fichier s’il n’existe pas encore. Comme ça:

  string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre); 
  using (StreamWriter sw = new StreamWriter(filePath, true)) {
    //write my text 
  }

Qui utilise this StreamWriter constructeur .

8
Hans Passant

On a déjà répondu à cette question, mais voici une solution réelle qui vérifie si le répertoire existe et ajoute un nombre à la fin si le fichier texte Existe. J'utilise ceci pour créer des fichiers de journalisation quotidiens sur un service Windows que j'ai écrit. J'espère que ça aidera quelqu'un.

// How to create a log file with a sortable date and add numbering to it if it already exists.
public void CreateLogFile()
{
    // filePath usually comes from the App.config file. I've written the value explicitly here for demo purposes.
    var filePath = "C:\\Logs";

    // Append a backslash if one is not present at the end of the file path.
    if (!filePath.EndsWith("\\"))
    {
        filePath += "\\";
    }

    // Create the path if it doesn't exist.
    if (!Directory.Exists(filePath))
    {
        Directory.CreateDirectory(filePath);
    }

    // Create the file name with a calendar sortable date on the end.
    var now = DateTime.Now;
    filePath += string.Format("Daily Log [{0}-{1}-{2}].txt", now.Year, now.Month, now.Day);

    // Check if the file that is about to be created already exists. If so, append a number to the end.
    if (File.Exists(filePath))
    {
        var counter = 1;
        filePath = filePath.Replace(".txt", " (" + counter + ").txt");
        while (File.Exists(filePath))
        {
            filePath = filePath.Replace("(" + counter + ").txt", "(" + (counter + 1) + ").txt");
            counter++;
        }
    }

    // Note that after the file is created, the file stream is still open. It needs to be closed
    // once it is created if other methods need to access it.
    using (var file = File.Create(filePath))
    {
        file.Close();
    }
}
1
Halcyon

Essayez ce 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)) 
{ 
    //write my text 
}
0
Jaspal

Je pense connaître la raison de cette exception. Vous pouvez exécuter cet extrait de code dans plusieurs threads.

0
Kusala Subasinghe