using System.IO; using System.Text; namespace DldUtil { // from http://arstechnica.com/civis/viewtopic.php?p=22839293&sid=e2bcb348ac8b58c9016e6a0a6442ba1b#p22839293 public class BackwardReader { readonly FileStream fs; public BackwardReader(string path) { fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } public void JumpToEnd(long lineNumber) { fs.Seek(0, SeekOrigin.End); } public void JumpToLine(long lineNumber) { fs.Seek(lineNumber, SeekOrigin.Begin); } public string ReadLine() { var text = new byte[1]; long position = 0; fs.Seek(0, SeekOrigin.Current); position = fs.Position; // do we have a trailing \r\n? if (fs.Length > 1) { var vagnretur = new byte[2]; fs.Seek(-2, SeekOrigin.Current); fs.Read(vagnretur, 0, 2); if (Encoding.ASCII.GetString(vagnretur).Equals("\r\n")) { // move it back fs.Seek(-2, SeekOrigin.Current); position = fs.Position; } } while (fs.Position > 0) { text.Initialize(); // read one char fs.Read(text, 0, 1); var asciiText = Encoding.ASCII.GetString(text); // move back to the character before fs.Seek(-2, SeekOrigin.Current); if (asciiText.Equals("\n")) { fs.Read(text, 0, 1); asciiText = Encoding.ASCII.GetString(text); if (asciiText.Equals("\r")) { fs.Seek(1, SeekOrigin.Current); break; } } } var count = int.Parse((position - fs.Position).ToString()); var line = new byte[count]; fs.Read(line, 0, count); fs.Seek(-count, SeekOrigin.Current); return Encoding.ASCII.GetString(line); } public bool SOF { get { return fs.Position == 0; } } public void Close() { fs.Close(); } } }