c# - txt - Leyendo un archivo utilizado por otro proceso
el proceso no puede obtener acceso al archivo visual studio (2)
Llamada
File.Open(path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite)
Esto debería funcionar siempre que la otra aplicación no haya bloqueado el archivo exclusivamente.
Esta pregunta ya tiene una respuesta aquí:
Estoy monitoreando 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.
El problema es que no puedo usar el Streamreader
en el archivo porque lo está 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?
- Monitorear el archivo
- Haga una copia temporal cuando cambie
- Lee la copia temporal
- Eliminar la copia temporal
Necesito obtener el texto en el archivo cada vez que el servidor lo cambie.
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.
Necesitarás 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
//...
}
Adivinando en 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.