The StreamReader locks a text file whilst it is reading it.
Can I force the StreamReader to work in a "read-only" or "non locking" mode?
My workaround would be to copy the file to a temp location and read it from there but I would prefer to use the StreamReader directly if possible. Any alternative suggetions?
Background:
I've written a small app to get some stats out of a log file. This file is constantly being updating (several times a second) by an outside program lets call AAXXYY.
Reviewing the output suggests that my app may be locking the file and preventing AAXXYY from writing.
This is what I'm doing
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; }
The StreamReader class does maintain a lock on the file until you call the Close() method. So to not have the lock, we have to explicitly set up the sharing mode.
C# StreamReader is used to read characters to a stream in a specified encoding. StreamReader. Read method reads the next character or next set of characters from the input stream. StreamReader is inherited from TextReader that provides methods to read a character, block, line, or all content.
You can pass a FileStream to the StreamReader, and create the FileStream with the proper FileShare value. For instance:
using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (var reader = new StreamReader (file, Encoding.Unicode)) { }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With