web-dev-qa-db-fra.com

Comment puis-je lire un fichier même lorsque j'obtiens une exception «en cours d'utilisation par un autre processus»?

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?

44
Frustrated Guy
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();

Source d'origine pour le code

67
Development 4.0

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.

8
Hans Passant

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);
4
Barbara

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!

2
Brosto