Motivado por this answer Me preguntaba qué está pasando debajo de la cortina si uno usa lotes de FileStream.Seek(-1)
.FileStream.Seek vs. Buffered Reading
Para mayor claridad voy a volver a publicar la respuesta:
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);
}
Personalmente hubiera leído como 2048 bytes en un búfer y buscado ese búfer para el carbón.
Usando el reflector descubrí que internamente el método está usando SetFilePointer.
¿Hay alguna documentación sobre el almacenamiento en caché de Windows y la lectura de un archivo al revés? ¿Windows amortigua "hacia atrás" y consulta el búfer cuando usa Seek(-1)
consecutivamente o lo leerá adelante comenzando desde la posición actual?
Es interesante que, por un lado, la mayoría de la gente está de acuerdo con que Windows tiene un buen almacenamiento en caché, pero por otro lado, cada respuesta al "archivo de lectura hacia atrás" implica leer fragmentos de bytes y operar en ese fragmento.
Haciendo una revisión por pares seria ¿eh? – ChaosPandion
@ ChaosPandion: No califiqué tu comentario, solo tenía curiosidad. – VVS