2010-08-11 8 views
2

Lorsque j'exécute le code ci-dessous, j'obtiens l'exception commune The process cannot access the file *filePath* because it is being used by another process.Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus

Quel est le moyen le plus efficace pour permettre à ce thread d'attendre qu'il puisse accéder à ce fichier en toute sécurité?

Hypothèses:

  • le fichier vient d'être créé par moi, il est donc peu probable qu'une autre application y accède.
  • Plusieurs threads de mon application peuvent essayer d'exécuter ce code pour ajouter du texte au fichier.

:

using (var fs = File.Open(filePath, FileMode.Append)) //Exception here 
{ 
    using (var sw = new StreamWriter(fs)) 
    { 
     sw.WriteLine(text); 
    } 
} 

Jusqu'à présent, le meilleur que je suis venu avec est le suivant. Y a-t-il des inconvénients à le faire?

private static void WriteToFile(string filePath, string text, int retries) 
    { 
     const int maxRetries = 10; 
     try 
     { 
      using (var fs = File.Open(filePath, FileMode.Append)) 
      { 
       using (var sw = new StreamWriter(fs)) 
       { 
        sw.WriteLine(text); 
       } 
      } 
     } 
     catch (IOException) 
     { 
      if (retries < maxRetries) 
      { 
       Thread.Sleep(1); 
       WriteToFile(filePath, text, retries + 1); 
      } 
      else 
      { 
       throw new Exception("Max retries reached."); 
      } 
     } 
    } 

Répondre

3

Si plusieurs threads tentent d'accéder au même fichier, pensez à utiliser un mécanisme de verrouillage. La forme la plus simple pourrait être:

lock(someSharedObject) 
{ 
    using (var fs = File.Open(filePath, FileMode.Append)) //Exception here 
    { 
     using (var sw = new StreamWriter(fs)) 
     { 
      sw.WriteLine(text); 
     } 
    } 
} 

Comme alternative, tenez compte:

File.AppendText(text); 
2

Vous pouvez définir un FileShare pour permettre l'accès multiple avec cette commande File.Open comme

File.Open(path, FileMode.Open, FileAccess.Write, FileShare.ReadWrite) 

Mais je pense la façon la plus propre si vous avez plusieurs threads qui essaient d'écrire dans un fichier serait de mettre tous ces messages dans un Queue<T> et h ave un thread supplémentaire qui écrit tous les éléments de la file d'attente dans le fichier.

+0

dans mon cas, cela lance toujours la même exception. est-ce que je manque quelque chose? –

+0

@MauroBilotti: Etes-vous sûr que votre processus est le seul à accéder au fichier? – Oliver

+0

Oliver, ça marche, le fait est que j'ai dû changer l'accès aux fichiers en mode 'read' parce que je l'ouvrais de cette façon. Merci! Je vais vous upvote –

Questions connexes