2017-02-17 99 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 +线,它必须等待每一行的一秒,所以它花了很多时间来执行。