La lecture d'un fichier utilisé par un autre processus [dupliquer]

cette question a déjà une réponse ici:

je surveille un fichier texte qui est écrit par un programme serveur. Chaque fois que le fichier est modifié, le contenu sera sortie à une fenêtre dans mon programme.

Le problème est que je ne peux pas utiliser le Streamreader sur le fichier used by another process . Configurer un Filestream avec ReadWrite ne servira à rien puisque je ne peux pas contrôler le processus qui utilise le fichier.

je peux ouvrir le fichier dans notepad. Il doit être possible d'y accéder même si le serveur est à l'utiliser.

y a-t-il une bonne solution?

Dois-je faire la suite?

  1. Surveiller le fichier
  2. faire une copie temporaire de celui-ci quand il change
  3. Lire la temp copie
  4. supprimer la copie temporaire.

j'ai besoin du texte dans le fichier chaque fois que le serveur le modifie.

40
demandé sur Ryan Gates 2012-03-18 19:51:04

2 réponses

si notepad peut lire le fichier, alors vous aussi, clairement le programme n'a pas mis de verrou de lecture sur le fichier. Le problème que vous rencontrez est que StreamReader ouvrira le fichier avec FileShare.Lire. Qui refuse l'accès en écriture. Cela ne peut pas fonctionner, l'autre programme a déjà obtenu l'accès en écriture.

vous aurez besoin de créer le StreamReader comme ceci:

using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var sr = new StreamReader(fs, Encoding.Default)) {
    // read the stream
    //...
}

je devine l'encodage ici. Vous devez faire attention avec ce genre de code, l'autre programme écrit activement dans le fichier. Vous n'obtiendrez pas une indication de fin de fichier très fiable, obtenir une dernière ligne partielle est tout à fait possible. En particulier gênant lorsque vous continuez à lire le fichier pour essayer d'obtenir ce que le programme a ajouté.

82
répondu Hans Passant 2014-09-24 06:47:39

Appel

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

Cela devrait fonctionner aussi longtemps que l'autre demande n'a pas verrouillé le fichier exclusivement.

11
répondu SLaks 2012-03-18 15:54:47