我有这个方法来读取日志文件
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行,因为日志文件变得非常繁重,因此花费太多时间来读取完整的日志文件。
答案 0 :(得分:1)
您的代码存在一些可能解决您问题的性能问题。如果您的日志文件不是很大,您会发现使用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();
}
}
}