我想从最后一行读取一个文本文件,因为它可能很大,只想查看今天的日志内容。
我使用File.ReadLines
()并成功阅读最后一行。
我该如何阅读上一行?
或者有没有办法得到当前行号,以便我可以减去数字?
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);
}
}
答案 0 :(得分:0)
foreach (string f in Directory.GetFiles(sDir, "*.log", SearchOption.AllDirectories))
{
string last="", prev="";
foreach (string cur in File.ReadLines(f, Encoding.Default) )
{
prev = last;
last = cur;
}
//not sure what you want to do with "prev" here.
if (last.IndexOf("error", StringComparison.OrdinalIgnoreCase) > 0)
{
WriteError(last);
}
}
答案 1 :(得分:0)
我不清楚你是否要求避免阅读整个文件(在这种情况下,提出的重复答案是解决这个问题的最佳方法),或者你只是想弄清楚文件中的倒数第二行。
如果是后者,那么这将起作用:
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);
}
}