c# - txt - ¿Puedo evitar que un StreamReader bloquee un archivo de texto mientras está en uso?
streamreader readline (2)
StreamReader bloquea un archivo de texto mientras lo está leyendo.
¿Puedo forzar que StreamReader funcione en modo "solo lectura" o "sin bloqueo"?
Mi solución sería copiar el archivo a una ubicación temporal y leerlo desde allí, pero preferiría usar el StreamReader directamente si es posible. ¿Alguna sugerencia alternativa?
Fondo:
He escrito una pequeña aplicación para obtener estadísticas de un archivo de registro. Este archivo se actualiza constantemente (varias veces por segundo) mediante un programa externo, llamemos AAXXYY.
La revisión del resultado sugiere que mi aplicación puede bloquear el archivo y evitar que AAXXYY escriba.
Esto es lo que estoy haciendo
private void btnGetStats_Click(object sender, EventArgs e)
{
int countStarts = 0;
int countEnds = 0;
IList<string> sessions = new List<string>();
using(StreamReader stRead = new StreamReader(openFileDialog1.FileName,Encoding.Unicode))
{
while(!stRead.EndOfStream)
{
string line = stRead.ReadLine();
if(line.Contains("Session start"))
{
countStarts++;
sessions.Add(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
}
if (line.Contains("Session end"))
{
countEnds++;
sessions.Remove(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
}
}
}
txtStarts.Text = countStarts.ToString();
txtEnds.Text = countEnds.ToString();
txtDifference.Text = (countStarts - countEnds).ToString();
listBox1.DataSource = sessions;
}
Pensé que agregaría algo de contexto, StreamReader no bloquea un archivo para leer solo para escribir cuando se lo lee. Eche un vistazo al siguiente código de la clase StreamReader.
new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, FileOptions.SequentialScan);
Observe el parámetro FileAccess.Read predeterminado tomado para MSDN http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx
Permite la posterior apertura del archivo para la lectura. Si no se especifica este indicador, cualquier solicitud para abrir el archivo para su lectura (mediante este proceso u otro) fallará hasta que se cierre el archivo. Sin embargo, incluso si se especifica este indicador, aún pueden necesitarse permisos adicionales para acceder al archivo.
Nuevamente tomado de MSDN para permitir la lectura y la escritura, use FileAccess.ReadWrite en su lugar (como lo sugiere Jb Evain).
Permite la posterior apertura del archivo para leer o escribir. Si no se especifica este indicador, cualquier solicitud para abrir el archivo para lectura o escritura (mediante este proceso u otro) fallará hasta que se cierre el archivo. Sin embargo, incluso si se especifica este indicador, aún pueden necesitarse permisos adicionales para acceder al archivo.
Puede pasar un FileStream al StreamReader y crear FileStream con el valor adecuado de FileShare. Por ejemplo:
using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var reader = new StreamReader (file, Encoding.Unicode)) {
}