La lecture d'un fichier utilisé par un autre processus [dupliquer]
cette question a déjà une réponse ici:
- Comment puis-je lire un fichier même en obtenant une exception "utilisé par un autre processus"? 4 réponses
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?
- Surveiller le fichier
- faire une copie temporaire de celui-ci quand il change
- Lire la temp copie
- supprimer la copie temporaire.
j'ai besoin du texte dans le fichier chaque fois que le serveur le modifie.
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é.
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.