2014-06-26 27 views
0

我想监视我的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(文件路径)之前,很容易得到特定的行,因为它是一个数组,但我移到了streamreader,因为我收到异常(该文件被另一个进程使用)。

编辑:谢谢你的回答,它完美的作品。我想知道是否有可能,也有同样的想法,仍然可以获得特定的新行和所有在这行之后添加的新行,直到流的结束。 (因为新添加的日志可以写在多行上)

回答

0

既然你不能预测文件中第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(); 
    } 
} 
+0

不,我可以预测位置,我确切地知道我的新行的位置添加。但我不知道如何在流中使用这个位置,因为它不是一个简单的数组。 – user2443476

+0

@ user2443476“位置”是指从文件起始处的第一个字符的行数或字节偏移量吗? –

+0

好吧,如果你的位置只是你可以使用我建议的线 –