Pregunta

El StreamReader bloquea un archivo de texto mientras lo está leyendo.
¿Puedo forzar al StreamReader a trabajar en un " solo lectura " o " sin bloqueo " modo?

Mi solución alternativa sería copiar el archivo a una ubicación temporal y leerlo desde allí, pero preferiría usar StreamReader directamente si es posible. ¿Alguna sugerencia alternativa?

Fondo:
He escrito una pequeña aplicación para obtener algunas estadísticas de un archivo de registro. Este archivo está siendo actualizado constantemente (varias veces por segundo) por un programa externo que permite llamar a AAXXYY.

La revisión de la salida sugiere que mi aplicación puede estar bloqueando el archivo e impidiendo 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;
    }
¿Fue útil?

Solución

Puede pasar un FileStream al StreamReader y crear el FileStream con el valor correcto 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)) {
}

Otros consejos

Pensé que agregaría algo de contexto, StreamReader no bloquea un archivo para leer solo para escribir cuando se está leyendo. Eche un vistazo al código a continuación de la clase StreamReader.

 new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, FileOptions.SequentialScan);

Observe el parámetro predeterminado FileAccess.Read tomado para MSDN http: //msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

  

Permite la apertura posterior del archivo para su lectura. Si no se especifica este indicador, cualquier solicitud para abrir el archivo para su lectura (mediante este proceso u otro proceso) fallará hasta que el archivo se cierre. Sin embargo, incluso si se especifica este indicador, es posible que se necesiten permisos adicionales para acceder al archivo.

Nuevamente tomado de MSDN para permitir la lectura y escritura, use FileAccess.ReadWrite en su lugar (como lo sugiere Jb Evain).

  

Permite la apertura posterior del archivo para leer o escribir. Si esto   la bandera no está especificada, cualquier solicitud para abrir el archivo para leer o   la escritura (por este proceso u otro proceso) fallará hasta que el archivo   está cerrado. Sin embargo, incluso si se especifica esta bandera, adicional   Es posible que aún se necesiten permisos para acceder al archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top