web-dev-qa-db-fra.com

Ouvrir le fichier en lecture seule

Actuellement, voici comment j'ouvre un fichier pour le lire:

 using (TextReader reader = new StreamReader(Path.Combine(client._WorkLogFileLoc, "dump.txt")))
{
    //do stuff
}

Comment puis-je ouvrir le fichier en mode lecture seule, de sorte que si un autre processus a le fichier ouvert en même temps, mon programme peut toujours le lire.

40
xbonez

Le problème typique est que l'autre processus a le fichier ouvert pour l'écriture. Toutes les méthodes File et constructeurs StreamReader standard ouvrent le fichier avec FileShare.Read. Cela ne peut pas fonctionner, cela nie le partage d'écriture. Vous ne pouvez pas refuser l'écriture, l'autre processus a été le premier et a obtenu un accès en écriture. Vous serez donc refusé l'accès à la place.

Vous devez utiliser FileShare.ReadWrite, comme ceci:

var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
using (var sr = new StreamReader(fs))
{
    // etc...
}

Attention, vous aurez toujours un problème délicat, vous lisez un fichier à moitié écrit. L'autre processus vide les données du fichier à des moments aléatoires, vous pouvez très bien ne lire qu'une demi-ligne de texte. YMMV.

101
Hans Passant

Si vous souhaitez ouvrir le fichier en lecture seule, essayez ceci:

using (TextReader reader 
   = new StreamReader(File.OpenRead(Path.Combine(client._WorkLogFileLoc, "dump.txt")))) 
{     
         //do stuff 
} 

Notez l'appel à File.OpenRead () .

11
Jay Riggs

Vous pouvez définir l'attribut de fichier en appelant File.SetAttributes

string path = Path.Combine(client._WorkLogFileLoc, "dump.txt");
FileAttributes curAttributes = File.GetAttributes(path);
File.SetAttributes(path, curAttributes | FileAttributes.ReadOnly);
3
The Scrum Meister