Domanda

StreamReader blocca un file di testo mentre lo sta leggendo.
Posso forzare lo StreamReader a funzionare in modalità "sola lettura"? o "non bloccante" modalità?

La mia soluzione alternativa sarebbe quella di copiare il file in una posizione temporanea e leggerlo da lì, ma preferirei utilizzare direttamente StreamReader, se possibile. Qualche suggerimento alternativo?

Sfondo:
Ho scritto una piccola app per estrarre alcune statistiche da un file di registro. Questo file viene costantemente aggiornato (più volte al secondo) da un programma esterno consente di chiamare AAXXYY.

La revisione dell'output suggerisce che la mia app potrebbe bloccare il file e impedire la scrittura di AAXXYY.

Questo è quello che sto facendo

    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;
    }
È stato utile?

Soluzione

È possibile passare un FileStream a StreamReader e creare FileStream con il valore FileShare corretto. Ad esempio:

using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var reader = new StreamReader (file, Encoding.Unicode)) {
}

Altri suggerimenti

Pensavo di aggiungere un po 'di contesto, StreamReader non non blocca un file per la lettura solo per la scrittura mentre viene letto. Dai un'occhiata al codice seguente dalla classe StreamReader.

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

Nota il parametro FileAccess.Read predefinito preso per MSDN http: //msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

  

Consente la successiva apertura del file per la lettura. Se questo flag non viene specificato, qualsiasi richiesta di apertura del file per la lettura (mediante questo processo o un altro processo) fallirà fino alla chiusura del file. Tuttavia, anche se viene specificato questo flag, potrebbero essere necessarie autorizzazioni aggiuntive per accedere al file.

Ancora una volta preso da MSDN per consentire la lettura e la scrittura, utilizzare FileAccess.ReadWrite (come suggerito da Jb Evain).

  

Consente la successiva apertura del file per la lettura o la scrittura. Se questo   flag non è specificato, qualsiasi richiesta di apertura del file per la lettura o   la scrittura (con questo processo o con un altro processo) fallirà fino a quando il file   è chiuso. Tuttavia, anche se questo flag è specificato, aggiuntivo   potrebbero essere necessarie autorizzazioni per accedere al file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top