0

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

 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 行,因为日志文件变得非常沉重,因此读取完整的日志文件需要花费太多时间。

4

1 回答 1

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();
                }
            }
        }
于 2013-10-20T17:07:59.600 回答