【问题标题】:Read specific line from a file with stream从带有流的文件中读取特定行
【发布时间】:2014-06-26 09:59:20
【问题描述】:

我想监控我的 iis 日志文件,为此我阅读它们:

using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            using (var sr = new StreamReader(fs, Encoding.Default))
            {
                while (sr.Peek() > 0)
                {
                    client.send(sr.ReadLine());
                }
            }

然后将行发送到我的数据库。我还使用 FileSystemWatcher 来检测更改并使用索引字典(键:文件路径,值:最后一行)发送新行。 streamreader 的问题是我不知道如何获取特定的行。我之前使用过 File.ReadAllLines(file path),因为它是一个数组,所以很容易获取特定的行,但我转移到了流读取器,因为我遇到了异常(该文件被另一个进程使用)。

编辑:感谢您的回答,它工作得很好。我想知道是否有可能以相同的想法仍然获得特定的新行以及在该行之后添加的所有新行,直到流结束。 (因为一个新添加的日志可以写多行)

【问题讨论】:

    标签: c# stream


    【解决方案1】:

    由于您无法预测文件中第 i 行的位置(可以吗?),您也必须阅读所有前面的行。如果行号很小,这可能比 ReadAllLines 方法更有效。试试这个

    string GetLine(string fileName, int line)
    {
       using (var sr = new StreamReader(fileName)) {
           for (int i = 1; i < line; i++)
              sr.ReadLine();
           return sr.ReadLine();
       }
    }
    

    【讨论】:

    • 不,我可以预测位置,我确切地知道我添加的新行的位置。但是我不知道如何在流中使用这个位置,因为它不是一个简单的数组。
    • @user2443476 “位置”是指行号还是第一个字符距文件开头的字节偏移量?
    • 好的,如果你的位置只是你可以使用我建议的行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多