c# - StreamReader and seeking
c#, file-io, streamreader
Solution
Yes you can, see this:
var sr = new StreamReader("test.txt");
sr.BaseStream.Seek(2, SeekOrigin.Begin); // Check sr.BaseStream.CanSeek first
Update: Be aware that you can't necessarily use `sr.BaseStream.Position` to anything useful because `StreamReader` uses buffers so it will not reflect what you actually have read. I guess you gonna have problems finding the true position. Because you can't just count characters (different encodings and therefore character lengths). I think the best way is to work with `FileStream`´s themselves.
Update: Use the `TGREER.myStreamReader` from here: http://www.daniweb.com/software-development/csharp/threads/35078 this class adds `BytesRead` etc. (works with `ReadLine()` but apparently not with other reads methods) and then you can do like this:
File.WriteAllText("test.txt", "1234\n56789");
long position = -1;
using (var sr = new myStreamReader("test.txt"))
{
Console.WriteLine(sr.ReadLine());
position = sr.BytesRead;
}
Console.WriteLine("Wait");
using (var sr = new myStreamReader("test.txt"))
{
sr.BaseStream.Seek(position, SeekOrigin.Begin);
Console.WriteLine(sr.ReadToEnd());
}
Problem
Can you use `StreamReader` to read a normal textfile and then in the middle of reading close the `StreamReader` after saving the current position and then open `StreamReader` again and start reading from that poistion ? If not what else can I use to accomplish the same case without locking the file ? I tried this but it doesn't work: ``` var fs = File.Open(@ "C:\testfile.txt", FileMode.Open, FileAccess.Read); var sr = new StreamReader(fs); Debug.WriteLine(sr.ReadLine()); //Prints:firstline var pos = fs.Position; while (!sr.EndOfStream) { Debug.WriteLine(sr.ReadLine()); } fs.Seek(pos, SeekOrigin.Begin); Debug.WriteLine(sr.ReadLine()); //Prints Nothing, i expect it to print SecondLine. ``` Here is the other code I also tried : ``` var position = -1; StreamReaderSE sr = new StreamReaderSE(@ "c:\testfile.txt"); Debug.WriteLine(sr.ReadLine()); position = sr.BytesRead; Debug.WriteLine(sr.ReadLine()); Debug.WriteLine(sr.ReadLine()); Debug.WriteLine(sr.ReadLine()); Debug.WriteLine(sr.ReadLine()); Debug.WriteLine("Wait"); sr.BaseStream.Seek(position, SeekOrigin.Begin); Debug.WriteLine(sr.ReadLine()); ```