C# 使用File.ReadLines读取上一行

C# 使用File.ReadLines读取上一行,c#,file.readalllines,C#,File.readalllines,我想从最后一行读取一个文本文件,因为它可能很大,只想检查今天的日志内容 我正在使用File.ReadLines()和success来读取最后一行。 我怎样才能读上一行? 或者有没有办法得到当前的行号,这样我就可以减去行号 foreach (string f in Directory.GetFiles(sDir, "*.log", SearchOption.AllDirectories)) { string last = File.ReadLines(f, Encoding.Default

我想从最后一行读取一个文本文件,因为它可能很大,只想检查今天的日志内容

我正在使用
File.ReadLines
()和success来读取最后一行。 我怎样才能读上一行? 或者有没有办法得到当前的行号,这样我就可以减去行号

foreach (string f in Directory.GetFiles(sDir, "*.log", SearchOption.AllDirectories))
{
    string last = File.ReadLines(f, Encoding.Default).Last(); //read Last Line here

    if (last.IndexOf("error", StringComparison.OrdinalIgnoreCase) > 0)
    {
        WriteError(last);
    }
}

我真的不清楚您是要求避免阅读整个文件(在这种情况下,建议的重复答案是实现此目的的最佳方式),还是希望能够找出文件中最后一行的下一行

如果是后者,那么这将起作用:

string[] Tail(string file, int maxLinesToReturn, Encoding encoding)
{
    Queue<string> mostRecentLines = new Queue<string>();

    foreach (string line in File.ReadLines(file, encoding))
    {
        if (mostRecentLines.Count >= maxLinesToReturn)
        {
            mostRecentLines.Dequeue();
        }
        mostRecentLines.Enqueue(line);
    }

    return mostRecentLines.ToArray();
}

我强烈怀疑OP要寻找的不仅仅是last+next to last,在这种情况下,它无法扩展…为所需的行数添加一个数组并移动数组并不难,但在OP添加更多信息之前,我们无法知道需要做多少。在问题更新之前,我不知道如何提供更多信息。只有一行吗?你怎么能确定要走多远?如果您想在运行中做出某种决定,那么最好从使用streams开始,在streams中您可以将读取指针向后移动。我们的两个答案仍然读取整个文件。这就是他们知道断线在哪里的原因。如果他想避免阅读整个文件,他需要在一个低得多的层次上工作,使用流从结尾向后工作。这就是为什么我也投票结束了这个问题,作为问题第一条评论中引用的答案的副本(这是一个实现,从最后向后工作)。但推断他/她不介意阅读整个文件是完全合理的:即使是一个“巨大”的文件,可能产生比人类想要阅读的更多的输出,也可以在相对较短的时间内处理。
string[] Tail(string file, int maxLinesToReturn, Encoding encoding)
{
    Queue<string> mostRecentLines = new Queue<string>();

    foreach (string line in File.ReadLines(file, encoding))
    {
        if (mostRecentLines.Count >= maxLinesToReturn)
        {
            mostRecentLines.Dequeue();
        }
        mostRecentLines.Enqueue(line);
    }

    return mostRecentLines.ToArray();
}
foreach (string f in Directory.GetFiles(sDir, "*.log", SearchOption.AllDirectories))
{
    foreach (string line in Tail(f, 2, Encoding.Default)
        .Where(line => line.IndexOf("error", StringComparison.OrdinalIgnoreCase) > 0)))
    {
        WriteError(line);
    }
}