从末尾开始读取文件,类似于尾部

C. *_*oss 35 c# file-io

在本机C#中,如何从文件末尾读取?

这是相关的,因为我需要读取一个日志文件,读取10k,读取最后3行是没有意义的.

Dar*_*rov 48

要读取最后1024个字节:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是否可以使用可以使用多个字节来编码字符的字符集(例如UTF-8)?看起来你最终可能会从多字节序列的中间开始. (3认同)

Cha*_*ion 9

也许这样的事情对你有用:

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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是假设\r\n.


Ste*_*end 5

下面的代码使用随机访问在文件末尾附近的偏移量处FileStream播种 a ,丢弃第一个读取行,因为它很可能只是部分读取。StreamReader

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);
}
Run Code Online (Sandbox Code Playgroud)