2017-02-17 140 views
0

我一直在試圖實時讀取文本文件並在控制檯中顯示其最後一行。問題是,當增長大小300kb +我的代碼無法處理它或只是事件不觸發。 我確實閱讀過谷歌上的所有帖子,但無法真正想到如何正確實現此目標。請記住,我是編程超級新手。C#實時讀取文本文件

如果您能分享關於如何實現此目的的任何想法,我將不勝感激。 這裏是我的示例代碼:

var wh = new AutoResetEvent(false); 
     var fsw = new FileSystemWatcher("."); 
     fsw.Filter = pathToFile; 
     fsw.EnableRaisingEvents = true; 
     fsw.Changed += (s, e) => wh.Set(); 

     var fs = new FileStream("c:/test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
     using (var sr = new StreamReader(fs)) 
     { 
      var s = ""; 
      while (true) 
      { 
       s = sr.ReadLine(); 
       if (s != null && s.Contains("CActor::ClKill")) 
       { 
        await b.Channel.SendMessage(s); 
        Console.WriteLine("Transmitting: " + s); 
       } 
       else 
       { 
        Console.WriteLine("Sleeping..."); 
        wh.WaitOne(1000); 
       } 
      } 
     } 

     wh.Close(); 
+0

您可以檢查這篇文章 http://stackoverflow.com/questions/11625595/read-last-line-of-text-file –

回答

-1

如果你只是想顯示文件的最後一行,那麼你可以做到以下幾點:

var lastLine = File.ReadLines("c:/test.txt").Last(); 

由於MSDN說:

當您使用ReadLines時,可以在返回整個集合之前開始枚舉 字符串的集合;當您使用 ReadAllLines時,必須先等待返回 之前的整個字符串數組,然後才能訪問該數組。因此,當您使用 非常大的文件時,ReadLines可以更高效

+1

調用'.Last'將枚舉_entire file_,僅用於讀取最後一行。這不是非常有效。 (實際上,它將與'.ReadAllLines()。Last()')幾乎完全相同。讀取OP所發佈的代碼,似乎很清楚(儘管問題中含糊不清),其目的是讀取文件的尾部內容,並將其寫入磁盤。 –

+0

@DanPuzey我不同意你的看法。我認爲OP正在閱讀最後一行,如果它等於字符串「CActor :: ClKill」,然後執行一些業務邏輯。在這種情況下,ReadLines和ReadAllLines可能需要相似的時間,但如果它是一個非常大的文件,它會稍微快一點並消耗更少的內存。 – NicoRiff

+0

爲什麼你說它會更快/使用更少的內存?整個文件仍然需要讀取,所以整體內存是相同的(儘管如果您接受GC的開銷,可能會使用'ReadLines'提前釋放內存......)此外,使用'ReadLines'每行讀是一個單獨的磁盤操作 - 我更可能會認爲''ReadAllLines''在一次通過磁盤訪問。 –

0

我確實找到了解決該問題的方法。

wh.WaitOne(1000);顯然是太長了,在更大的文件可以說300 +線,它必須等待每一行的一秒,所以它花了很多時間來執行。