Мотивировано этим ответом Мне было интересно, что происходит под занавесом, если кто-то использует много FileStream.Seek(-1)
.
Для ясности я перепишу ответ:
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);
}
Лично я бы прочитал 2048 байт в буфер и искал в этом буфере символ.
Использование Reflector Я обнаружил, что внутренне метод использует SetFilePointer .
Есть ли документация о кэшировании и чтении файла в обратном направлении?Windows буферизует «назад» и обращается к буферу при последовательном Seek(-1)
или будет читать вперед, начиная с текущей позиции?
Интересно, что, с одной стороны, большинство людей согласны с тем, что Windows хорошо кэширует, нос другой стороны, каждый ответ на «чтение файла в обратном направлении» включает чтение фрагментов байтов и работу с этим фрагментом.