2017-02-17 8 views
0

Я пытался прочитать в реальном времени текстовый файл и отобразить его последнюю строку в консоли. Проблема в том, что когда размер в размере 300kb + мой код не может обработать его или просто событие не запускается. Я прочитал почти все сообщения в google, но не могу по-настоящему думать о том, как добиться этого правильно. Имейте в виду, что я супер новый для программирования.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_, только для чтения последней строки , Это не очень эффективно. (Фактически, он будет работать почти идентично с .ReadAllLines(). Last() '). Читая код, отправленный OP, мне кажется очевидным, что (несмотря на неоднозначную формулировку в вопросе), цель состоит в том, чтобы прочитать содержимое хвоста в файле _as, записанное на диск. –

+0

@ DanPuzey Я не согласен с тобой. Я думаю, что OP хочет прочитать последнюю строку, если она равна строке «CActor :: ClKill», а затем выполните некоторую бизнес-логику. ReadLines и ReadAllLines могут занять аналогичное время в этом сценарии, но если это очень большой файл, он будет немного быстрее и потребляет меньше памяти. – NicoRiff

+0

Почему вы говорите, что это будет быстрее/использовать меньше памяти? Весь файл все еще должен быть прочитан, поэтому общая память одинаков (хотя есть потенциал для того, чтобы память была выпущена раньше с помощью ReadLines, если вы принимаете накладные расходы на GC ...) Далее, с 'ReadLines' каждая строка read - это отдельная операция с диском - я бы с большей вероятностью предположил, что 'ReadAllLines' делает доступ к диску за один проход. –

0

Я нашел решение проблемы.

wh.WaitOne (1000); был, по-видимому, слишком длинным, и в больших файлах можно сказать, что 300+ строк ему пришлось ждать секунду для каждой строки, поэтому потребовалось много времени для выполнения.

Смежные вопросы