Lea desde un archivo que comienza al final, similar a la cola

En C # nativo, ¿cómo puedo leer desde el final de un archivo?

Esto es pertinente porque necesito leer un archivo de registro, y no tiene sentido leer 10k, leer las últimas 3 líneas.

Para leer los últimos 1024 bytes:

using (var reader = new StreamReader("foo.txt")) { if (reader.BaseStream.Length > 1024) { reader.BaseStream.Seek(-1024, SeekOrigin.End); } string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } 

Tal vez algo como esto funcione para usted:

 using (var fs = File.OpenRead(filePath)) { fs.Seek(0, SeekOrigin.End); int newLines = 0; while (newLines < 3) { fs.Seek(-1, SeekOrigin.Current); newLines += fs.ReadByte() == 13 ? 1 : 0; // look for \r fs.Seek(-1, SeekOrigin.Current); } byte[] data = new byte[fs.Length - fs.Position]; fs.Read(data, 0, data.Length); } 

Tenga en cuenta que esto supone \r\n .

El código siguiente utiliza un FileStream acceso aleatorio para FileStream un StreamReader en un desplazamiento cerca del final del archivo, descartando la primera línea de lectura, ya que es muy probable que solo sea parcial.

 FileStream stream = new FileStream(@"c:\temp\build.txt", FileMode.Open, FileAccess.Read); stream.Seek(-1024, SeekOrigin.End); // rewind enough for > 1 line StreamReader reader = new StreamReader(stream); reader.ReadLine(); // discard partial line while (!reader.EndOfStream) { string nextLine = reader.ReadLine(); Console.WriteLine(nextLine); } 

Eche un vistazo a la respuesta de esta pregunta relacionada para leer un archivo de texto al revés. Hay una gran complejidad para leer correctamente un archivo .