2015-09-09 54 views
0

我正試圖在C#中編寫一個控制檯應用程序來讀取日誌文件。我面臨的問題是,這個日誌文件每隔1小時更新一次,例如,如果我在開始時有10行,之後是12,在第二次讀取時,我將不得不只讀取2個新添加的行。 你能否建議我一種有效的方法(無需再次讀取所有行,因爲日誌文件通常具有5000多行)?如何讀取在c#中每小時更新的日誌文件?

+0

如果我正確理解你的問題,你可以嘗試以下方法:VAR nextLines = File.ReadLines( 「文件路徑」)跳過(lineCount)。 – Sean

+0

@謝恩謝謝你的回答,我已經試過了,但是有朋友告訴我它仍然會讀取整個日誌文件,所以在5-10k行的情況下,它可能不是那麼高效。 –

+0

也許不是。我想這取決於文件的大小 - Garath的答案也不是一個糟糕的路線。 – Sean

回答

2

首先,您可以使用FileSystemWatcher在文件更改後發出通知。

你可以使用FileStreamSeek函數只准備新添加的行。在http://www.codeproject.com/Articles/7568/Tail-NET存在與Thread.Sleep一個例子:

using (StreamReader reader = new StreamReader(new FileStream(fileName, 
        FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) 
{ 
    //start at the end of the file 
    long lastMaxOffset = reader.BaseStream.Length; 

    while (true) 
    { 
     System.Threading.Thread.Sleep(100); 

     //if the file size has not changed, idle 
     if (reader.BaseStream.Length == lastMaxOffset) 
      continue; 

     //seek to the last max offset 
     reader.BaseStream.Seek(lastMaxOffset, SeekOrigin.Begin); 

     //read out of the file until the EOF 
     string line = ""; 
     while ((line = reader.ReadLine()) != null) 
      Console.WriteLine(line); 

     //update the last max offset 
     lastMaxOffset = reader.BaseStream.Position; 
    } 
} 
+0

謝謝@Garath,你的解決方案對我有好處。我只是有一個問題。我用一個Console.WriteLine(lastMaxOffset)來查看我會得到什麼值,並且有一個數字,例如1911.你能告訴我這個值代表什麼? –

+0

它在文件中被抵消。所以下次文件流開始讀取這個值 –

相關問題