2012-03-18 14 views
32

Estoy supervisando un archivo de texto que está siendo escrito por un programa de servidor. Cada vez que se cambia el archivo, el contenido se enviará a una ventana de mi programa.Lectura de un archivo utilizado por otro proceso

El problema es que no puedo usar el Streamreader en el archivo, ya que está siendo used by another process. Configurar un Filestream con ReadWrite no servirá de nada ya que no puedo controlar el proceso que está usando el archivo.

Puedo abrir el archivo en el bloc de notas. Debe ser posible acceder a él aunque el servidor lo esté utilizando.

¿Hay una buena forma de evitar esto?

¿Debo hacer lo siguiente?

  1. Monitorear el archivo
  2. Haga una copia temporal de la misma cuando se cambia
  3. Leer la copia temporal
  4. eliminar la copia temporal.

Necesito obtener el texto en el archivo cada vez que el servidor lo cambia.

Respuesta

67

Si el bloc de notas puede leer el archivo, tú también puedes, claramente el programa no puso un bloqueo de lectura en el archivo. El problema al que se está enfrentando es que StreamReader abrirá el archivo con FileShare.Read. Que niega el acceso de escritura. Eso no puede funcionar, el otro programa ya obtuvo acceso de escritura.

Tendrá que crear el StreamReader así:

using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using (var sr = new StreamReader(fs, Encoding.Default)) { 
    // read the stream 
    //... 
} 

Las conjeturas sobre la codificación aquí. Tienes que tener cuidado con este tipo de código, el otro programa está escribiendo activamente en el archivo. No obtendrá una indicación de fin de archivo muy confiable, es muy posible obtener una última línea parcial. En particular, es problemático cuando sigue leyendo el archivo para tratar de obtener lo que sea que el programa adjunte.

+2

Gracias ... No me di cuenta de que FileShare.Read sería incorrecto en este caso. –

+2

Al usar 'FileShare.ReadWrite | FileShare.Delete' puede obtener acceso a una cantidad aún mayor de archivos. Vale la pena intentarlo cuando 'FileShare.ReadWrite' no es suficiente – Adassko

+0

@Adassko O cuando' FileShare.Read' no es suficiente, como en este caso, y en mi situación particular, donde estaba usando eso en el mismo tipo de código, y tuvo que cambiar a 'FileShare.ReadWrite' para que funcione. – vapcguy

10

llamada

File.Open(path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite) 

Esto debería funcionar siempre y cuando la otra aplicación no ha bloqueado el archivo exclusivamente.

+0

Gracias. ¿Funcionará eso en combinación con un lector de secuencias? De esta manera: File.Open (ruta, FileMode.Read, FileAccess.Read, FileShare.ReadWrite); Lector de StreamReader = nuevo StreamReader (ruta); – Christoffer

+0

@Tophe: por supuesto. IIRC, el controlador 'StreamReader' también puede tomar estos parámetros directamente. – SLaks

+0

¿Cómo se vería eso? Si pongo el FileMode.Open, FileAccess.Read, FileShare.ReadWrite como parámetros en el Streamreader, no funcionará. Dice que solo toma algunos parámetros de codificación. – Christoffer

Cuestiones relacionadas