Чтение из файла, начинающегося в конце, похожего на tail - PullRequest
35 голосов
/ 06 декабря 2010

В родном C #, как я могу прочитать с конца файла?

Это уместно, потому что мне нужно прочитать файл журнала, и нет смысла читать 10k, читать последние 3 строки.

Ответы [ 4 ]

48 голосов
/ 06 декабря 2010

Чтобы прочитать последние 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);
    }
}
9 голосов
/ 06 декабря 2010

Может быть, что-то вроде этого будет работать для вас:

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);
}

Обратите внимание, что это предполагает \r\n.

3 голосов
/ 06 декабря 2010

В приведенном ниже коде используется случайный доступ FileStream для заполнения 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);
}
1 голос
/ 31 мая 2018

Посмотрите на этот ответ на связанный вопрос , чтобы прочитать текстовый файл в обратном порядке. Правильно читать файл назад очень сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...