C# 以相反的顺序读取日志文件,只需读取几行就可以了,而不是完整的文件

C# 以相反的顺序读取日志文件,只需读取几行就可以了,而不是完整的文件,c#,C#,我有这个方法来读取日志文件 public static string GetFileData() { FileStream logFileStream = new FileStream(ConfigurationManager.AppSettings["LogFileLocation"].ToString(), FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader logF

我有这个方法来读取日志文件

 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();
                }
            }
        }
public IEnumerable可读行(字符串文件名){
FileStream logFileStream=新文件流(文件名,FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
使用(StreamReader logFileReader=新StreamReader(logFileStream)){
而(!logFileReader.EndOfStream){
返回logFileReader.ReadLine();
}
}
}

这可能会有帮助:(可能重复)或者这个(也可能重复)@chrislaplant谢谢,我正在研究这个问题。如何将日志值合并到单个字符串中。在我看来,这个方法是从jQueryAjax调用的,在一段时间后刷新屏幕。这是一种糟糕的形式,因为它在显示最后几行之前读取整个文件。