2017-01-01 6 views
-3

Действительно новый для C#. Мне нужно найти текстовый файл для ключевого слова. Если после поиска всего файла, ключевое слово найдено поп-поле. Если после поиска всего файла, ключевое слово НЕ найдено, появится окно сообщения.C# поиск в текстовом файле

Пока у меня это внизу. Проблема в том, что он читает файл по строкам. Если в первой строке ключевое слово не найдено, оно отображает предупреждение «Не найдено». Затем переходите к следующей строке и снова показываем «Не найдено». И так далее. Мне нужен скрипт для поиска по всему файлу, и только затем покажите «Не найдено» только один раз. Спасибо!

private void SearchButton_Click(object sender, EventArgs e) 
{ 
    System.IO.StreamReader file = new System.IO.StreamReader("c:\\test.txt"); 
    String line; 
    String[] array; 
    while ((line = file.ReadLine()) != null) 
    { 
     if (line.Contains("keyword")) 
     { 
      MessageBox.Show("Keyword found!"); 
     } 
     else 
     { 
      MessageBox.Show("Keyword not found!"); 
     } 
    } 
} 
+0

Итак, просто прочитайте весь файл, используя ['ReadToEnd'] (https://msdn.microsoft.com/en-us/library/system.io.streamreader.readtoend (v = vs.110) .aspx)? – UnholySheep

+3

Что вы пробовали? Вы можете подумать о том, чтобы не показывать ящик сообщений сразу, но сохранить результат в переменной, которую вы проверяете после цикла. – CodeCaster

+0

Вы должны рассмотреть возможность загрузки файлов и поиска в них асинхронно (поток, threadpool, backgroundworker или лучше механизм async/await). – honzakuzel1989

ответ

0

File.ReadAllText лучше подходит для этого, вы можете прочитать в весь текст сразу в одной строке:

string file = File.ReadAllText("path"); 

if (file.Contains(keyword))  { 
//.. 
} 
else { 
//.. 
} 

или в одной строке:

if (File.ReadAllText("path").Contains("path")) { 
} 
else { 
} 

Как заявил в комментариях у вас может быть нехватка памяти для очень больших файлов, но для повседневного использования это обычно не происходит.

+1

следует добавить, что это не подходит для больших файлов. –

+2

Вы говорите кому-то, кто только начал программировать _ «используйте этот код вместо» _, не объясняя _why_, они должны использовать код, а также какие недостатки указанного кода. – CodeCaster

+0

Спасибо Servé Laurijssen, отлично работает! – Malasorte

1

Попробуйте использовать File класс вместо читателей (которые вы должны Dispose для того, чтобы предотвратить утечку ресурсов):

bool found = File 
    .ReadLines("c:\\test.txt") // Try avoid "All" when reading: ReadAllText, ReadAllLines 
    .Any(line => line.Contains("keyword")); 

if (found) 
    MessageBox.Show("Keyword found!"); 
else 
    MessageBox.Show("Keyword not found!"); 

Ваш код измененными (если вы настаиваете на StreamReader):

private void SearchButton_Click(object sender, EventArgs e) { 
    // Wra IDisposable (StreamReader) into using in order to prevent resource leakage 
    using (file = new StreamReader("c:\\test.txt")) { 
    string line; 

    while ((line = file.ReadLine()) != null) 
     if (line.Contains("keyword")) { 
     MessageBox.Show("Keyword found!"); 

     return; // Keyword found, reported and so we have nothing to do 
     } 
    } 

    // File read with no positive result 
    MessageBox.Show("Keyword not found!"); 
} 
Смежные вопросы