¿Cómo puedo leer un archivo incluso cuando recibo una excepción “en uso por otro proceso”?

En VB.NET o C #, bash leer el contenido de un archivo de texto que está utilizando otro progtwig (ese es el punto, en realidad, no puedo detener el progtwig o deja de escribir en el archivo de texto, y Deseo leer periódicamente lo que está actualmente en el archivo de texto en otro progtwig).

Este es el código que estoy usando (VB.NET)

Dim strContents As String Dim objReader As StreamReader objReader = New StreamReader(FullPath) strContents = objReader.ReadToEnd() objReader.Close() 

O en C #:

 var objReader = new StreamReader(FullPath); var strContents = objReader.ReadToEnd(); objReader.Close(); 

Lo anterior, sin embargo, arroja la excepción IO “El proceso no puede acceder al archivo ‘file.txt’ porque está siendo utilizado por otro proceso”. ¿Hay alguna solución en este escenario?

 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(); 

Fuente original para el código

Haré el pez. El modo FileShare es crítico, debe permitir el uso compartido de escritura. Eso no se puede denegar ya que el proceso que está escribiendo el archivo ya obtuvo acceso de escritura. El constructor StreamReader () usa FileShare.Read y no tiene una opción para usar un valor diferente. El uso del constructor StreamReader (Stream) es en realidad la solución.

Sin embargo, ten en cuenta que este modo de compartir también tiene implicaciones para tu código. No puede predecir cuándo el otro proceso vacía el archivo. La última línea que lees puede contener solo una parte de una línea de texto. Cuando se vacíe vuelve a almacenarse en el búfer de archivos, más adelante obtendrá el rest de la línea. Claramente, esto puede arruinar tu lógica.

Depende del modo FileShare con el que el archivo fue abierto por la otra aplicación que se agrega al archivo. Cuando la otra aplicación abría el archivo, especificaba un modo FileShare para que otras aplicaciones accedieran al archivo. Este modo de FileShare podría haber sido leído, escrito, ambos, eliminar, todo esto o ninguno .

FileShare especificar el mismo modo de FileShare que la otra aplicación especificó. Si la otra aplicación solo permite la lectura, use FileShare.Read; si permitió leer y escribir, use FileShare.ReadWrite .

StreamReader usa solo el modo FileShare.Read , por lo que ya puede suponer que esa no es la correcta. Por lo tanto, prueba ReadWrite, así:

 FileStream fs = new FileStream(FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader reader = new StreamReader(fs); 

No estoy seguro de cómo se comportará esto con un archivo ya abierto, pero esto evitará que la aplicación lo bloquee:

 FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader sr = new StreamReader(fs); 

¡Espero eso ayude!