2011-02-11 23 views
30

Actualmente, esta es la forma en que estoy abriendo un archivo para leerlo:Abrir el archivo de sólo lectura

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

¿Cómo puedo abrir el archivo en modo de sólo lectura, por lo que si otro proceso tiene el archivo abierto al mismo tiempo, mi programa todavía puede leerlo.

+0

¿Desea abrir la transmisión en modo Lectura? ¿O desea configurar el atributo de archivo ReadOnly? –

+0

Quiero abrirlo ReadOnly – xbonez

+0

Tenga en cuenta que si otro proceso tiene el archivo abierto, ese proceso aún debe tener habilitado el uso compartido de lectura para que pueda leerlo. Si el otro proceso abrió el archivo con el intercambio denegado, incluso se podría evitar abrir el archivo como de solo lectura. Consulte la enumeración de FileShare (o el equivalente de Win32) para obtener más información. – itowlson

Respuesta

73

El problema típico es que el otro proceso tiene el archivo abierto para escritura. Todos los métodos de archivo estándar y los constructores de StreamReader abren el archivo con FileShare.Read. Eso no puede funcionar, eso niega el intercambio de escritura. No puede denegar la escritura, el otro proceso fue el primero y obtuvo acceso de escritura. Por lo tanto, se te denegará el acceso.

usted tiene que utilizar FileShare.ReadWrite, así:

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

Tenga en cuenta que usted todavía tiene un problema complicado, que está leyendo un archivo a medio escribir. El otro proceso vacía datos en el archivo en puntos aleatorios en el tiempo, puede leer solo media línea de texto. YMMV.

+0

Gracias. Parece que esto es lo que estaba buscando. Leer un archivo medio escrito no será un problema para mí debido a la forma en que mi programa maneja la lectura del archivo. – xbonez

+0

¡Eso me salvó! Como bien lo dijo, todas las demás funciones se abren con FileShare.Read. ¡Estaba intentando desde hace bastante tiempo descifrar con una variante diferente de las funciones de lector de strean ...! –

3

puede establecer el atributo de archivo llamando File.SetAttributes

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

Si desea abrir el archivo de sólo lectura, intente esto:

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

Aviso la llamada a File.OpenRead().

+0

Maldición, vencerme por segundos. ; p +1 para ti. –

+0

No funcionó para mí. Hans lo hizo. – nawfal

Cuestiones relacionadas