Dans VB.NET ou C #, j'essaie de lire le contenu d'un fichier texte utilisé par un autre programme (c'est le point, en fait, je ne peux pas arrêter le programme ou il arrête d'écrire dans le fichier texte, et Je veux lire périodiquement ce qui se trouve actuellement dans le fichier texte d'un autre programme).
Ceci est le code que j'utilise (VB.NET)
Dim strContents As String
Dim objReader As StreamReader
objReader = New StreamReader(FullPath)
strContents = objReader.ReadToEnd()
objReader.Close()
Ou en C #:
var objReader = new StreamReader(FullPath);
var strContents = objReader.ReadToEnd();
objReader.Close();
Ce qui précède, cependant, lève l'exception IO "Le processus ne peut pas accéder au fichier 'file.txt' car il est utilisé par un autre processus." Y a-t-il des solutions de contournement dans ce scénario?
FileStream logFileStream = new FileStream("c:\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader logFileReader = new StreamReader(logFileStream);
while (!logFileReader.EndOfStream)
{
string line = logFileReader.ReadLine();
// Your code here
}
// Clean up
logFileReader.Close();
logFileStream.Close();
Je vais faire le poisson. Le mode FileShare est critique, vous devez autoriser le partage d'écriture. Cela ne peut pas être nié puisque le processus qui écrit le fichier a déjà obtenu un accès en écriture. Le constructeur StreamReader () utilise FileShare.Read et n'a pas d'option pour utiliser une valeur différente. L'utilisation du constructeur StreamReader (Stream) est plutôt la solution de contournement.
Attention cependant, ce mode de partage a également des implications sur votre code. Vous ne pouvez pas prédire quand l'autre processus vide le fichier. La dernière ligne que vous lisez peut ne contenir qu'une partie d'une ligne de texte. Lorsqu'il vide à nouveau le tampon de fichier, vous obtiendrez plus tard le reste de la ligne. De toute évidence, cela peut perturber votre logique.
Cela dépend du mode FileShare
avec lequel le fichier a été ouvert par l'autre application qui s'ajoute au fichier. Lorsque l'autre application ouvrait le fichier, elle spécifiait un mode FileShare
pour que d'autres applications accèdent au fichier. Ce mode FileShare
aurait pu être lire, écrire, les deux, supprimer, tout cela ou aucun.
Vous devez spécifier le même mode FileShare
que celui spécifié par l'autre application. Si l'autre application n'autorisait que la lecture, utilisez FileShare.Read;
s'il autorisait la lecture et l'écriture, utilisez FileShare.ReadWrite
.
StreamReader
utilise uniquement FileShare.Read
mode, vous pouvez donc déjà supposer que ce n'est pas le bon. Alors, essayez ReadWrite, comme ceci:
FileStream fs = new FileStream(FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader reader = new StreamReader(fs);
Vous ne savez pas comment cela se comportera avec un fichier déjà ouvert, mais cela empêchera votre application de le verrouiller:
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs);
J'espère que cela aide!