Как проверить, есть ли в текстовом поле строка из файла TXT с помощью С#

Это просто то, что я пытаюсь сделать; когда я нажимаю кнопку, мое приложение должно проверять, есть ли в textBox1.Text строка из текстового файла.

Примечание. Я не хочу проверять, есть ли в текстовом поле весь текстовый файл, просто чтобы увидеть, есть ли из него СТРОКА.

Я пробовал это без успеха:

 private void acceptBtn_Click(object sender, EventArgs e)
    {
        StreamReader sr = new StreamReader(usersPath);
        string usersTXT = sr.ReadLine();
        if (user_txt.Text == usersTXT)
        {
            loginPanel.Visible = false;
        }
    }

Надеюсь, кто-нибудь может мне помочь. Заранее спасибо - CCB


person ChrisCreateBoss    schedule 06.03.2015    source источник


Ответы (3)


string usersTXT = sr.ReadLine();

Читает ровно одну строку. Таким образом, вы только проверяете, соответствуете ли вы первой строке в файле.

Вам нужен File.ReadALlLines (который также удаляет поток правильно, которым вы не являетесь):

if (File.ReadAllLines(usersPath).Contains(user_txt.Text))
{
}

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

Вы также можете просто использовать File.ReadLines ( спасибо @ Selman22), чтобы получить версию с ленивым перечислением. Я бы лично пошел по этому пути.

Реализация, которая показывает это по адресу: http://referencesource.microsoft.com/#mscorlib/system/io/file.cs,675b2259e8706c26

person BradleyDotNET    schedule 06.03.2015

if (File.ReadAllLines(path).Any(x => x == line))
{
    // line found
}

Замените x == line проверкой без учета регистра или Contains, если хотите.

person SimpleVar    schedule 06.03.2015
comment
Хорошее предложение, обратите внимание, что ReadAllLines всегда читает весь файл (см. мой ответ), поэтому он может быть неэффективным, если файл большой, а ввод находится близко к началу. - person BradleyDotNET; 07.03.2015
comment
@Bradley Действительно, ReadLines в этом случае лучше. Однако возникает также вопрос о том, выполняется ли этот фрагмент кода только время от времени или много раз подряд. Если второе - лучше прочитать файл только один раз. - person SimpleVar; 07.03.2015
comment
Истинный. Конечно, в этот момент вам все равно нужно будет сохранить результаты, что немного изменяет код OP. Хотя отличный момент. - person BradleyDotNET; 07.03.2015

Попробуйте использовать функцию Contains() для строки:

private void acceptBtn_Click(object sender, EventArgs e)
{
    StreamReader sr = new StreamReader(usersPath);
    string usersTXT = sr.ReadLine();
    if (user_txt.Text.Contains(usersTXT))
    {
        loginPanel.Visible = false;
    }
}
person ryancdotnet    schedule 06.03.2015
comment
Это не решает большую проблему проверки только первой строки в файле. - person BradleyDotNET; 07.03.2015