web-dev-qa-db-fra.com

Lecture d'un fichier utilisé par un autre processus

Je surveille un fichier texte sur lequel un programme serveur écrit. Chaque fois que le fichier est modifié, le contenu sera affiché dans une fenêtre de mon programme.

Le problème est que je ne peux pas utiliser le Streamreader sur le fichier car il est used by another process. La configuration d'un Filestream avec ReadWrite ne fera aucun bien car je ne peux pas contrôler le processus qui utilise le fichier.

Je peux ouvrir le fichier dans le bloc-notes. Il doit être possible d'y accéder même si le serveur l'utilise.

Y a-t-il un bon moyen de contourner cela?

Dois-je faire ce qui suit?

  1. Surveillez le fichier
  2. Faites une copie temporaire de celui-ci quand il change
  3. Lire la copie temporaire
  4. Supprimez la copie temporaire.

J'ai besoin d'obtenir le texte dans le fichier chaque fois que le serveur le modifie.

45
Christoffer

Si le bloc-notes peut lire le fichier, vous le pouvez aussi, il est clair que 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.Read. Ce qui refuse l'accès en écriture. Cela ne peut pas fonctionner, l'autre programme a déjà obtenu un accès en écriture.

Vous devrez 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
    //...
}

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

96
Hans Passant

Appel

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

Cela devrait fonctionner tant que l'autre application n'a pas verrouillé le fichier exclusivement.

13
SLaks