Motiviert von this answer Ich frage mich, was passiert unter dem Vorhang, wenn man viele FileStream.Seek(-1)
verwendet.FileStream.Seek vs. Buffered Reading
Aus Gründen der Klarheit werde ich die Antwort umbuchen:
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);
}
Persönlich würde ich wie 2048 Bytes in einen Puffer gelesen und gesucht, die Puffer für den Saibling.
Mit Reflektor Ich fand heraus, dass intern die Methode SetFilePointer verwendet.
Gibt es Dokumentation über Windows-Caching und das Rückwärtslesen einer Datei? Speichert Windows "rückwärts" und fragt den Puffer ab, wenn fortlaufend Seek(-1)
verwendet wird, oder liest er von der aktuellen Position aus voraus?
Es ist interessant, dass auf der einen Seite die meisten Leute damit einverstanden sind, dass Windows gutes Caching macht, aber auf der anderen Seite beinhaltet jede Antwort auf "Datei rückwärts lesen" das Lesen von Brocken von Bytes und das Arbeiten mit diesem Brocken.
Doing serious Peer Review huh? – ChaosPandion
@ChaosPandion: Ich habe deinen Kommentar nicht bewertet, ich war nur neugierig. – VVS