以相反的顺序读取日志文件,而不是完整的文件,只需读取几行可能是 10 行
本文关键字:文件 读取 几行 日志 顺序 | 更新日期: 2023-09-27 18:36:04
我有这个方法来读取日志文件
public static string GetFileData()
{
FileStream logFileStream = new FileStream(ConfigurationManager.AppSettings["LogFileLocation"].ToString(), FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader logFileReader = new StreamReader(logFileStream);
string line = "";
while (!logFileReader.EndOfStream)
{
line += logFileReader.ReadLine()+"'n";
}
// Clean up
logFileReader.Close();
logFileStream.Close();
return line;
}
但是现在不是显示完整的日志文件,我只想向用户显示最后 10-20 行,因为日志文件变得非常繁重,因此读取完整的日志文件需要太多时间。
您的代码存在一些性能问题,这些问题可能会解决您的问题。 如果你的日志文件不是很大,你会发现使用 StringBuilder 类来累积你的字符串值会快得多,特别是如果你用文件的大小构造你的 StringBuilder。 更快的是这样做:
var log = System.IO.File.ReadAllLines("filename");
如果你真的只想要最后 10 行左右,你可以这样做:
var log = System.IO.File.ReadLines(filename).Reverse().Take(10);
没有任何特别好的方法可以向后读取流。 如果上述方法不能解决您的问题,您将不得不求助于将文件指针定位在文件末尾的"附近"并尝试弄清楚您是否有最后 n 行,如果没有,您必须再次定位文件指针(基本上编写猜测的代码,然后细化猜测......同时可能会添加新的日志行)。
下面是使用 StringBuilder 类的示例
System.Text.StringBuilder lines = new System.Text.StringBuilder();
while (!logFileReader.EndOfStream)
{
lines.AppendLine(logFileReader.ReadLine());
}
这将大大加快您的编码速度。
抱歉,可能是 System.IO.File.Read*Lines 方法需要对目标文件的独占访问权限。 您可以编写自己的 ReadLines 版本,其工作方式与上述代码类似,如下所示:
public IEnumerable<string> ReadLines(string filename) {
FileStream logFileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
using (StreamReader logFileReader = new StreamReader(logFileStream)) {
while (!logFileReader.EndOfStream) {
yield return logFileReader.ReadLine();
}
}
}