Как да проверите дали текстово поле има ред от TXT файл с C#

Това, което се опитвам да направя, е просто; когато щракна върху бутон, приложението ми трябва да провери дали textBox1.Text има ред от текстов файл.

Забележка: Не искам да проверявам дали текстовото поле съдържа целия текстов файл в него, само за да видя дали има LINE от него.

Опитах това без успех:

 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;
        }
    }

Надявам се някой да може да ми помогне. Благодаря предварително - ЦКБ


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

Опитайте да използвате функцията Contain() на низа:

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