С# чтение строки из файла с помощью StreamReader с DownloadFileAsync

У меня проблема с чтением файла с помощью StreamReader, а line != null добавить к textBox1

Код:

using(StreamReader reader = new StreamReader("lastupdate.txt"))
{
    string line;

    while((line = reader.ReadLine()) != null)
    {
        textBox1.Text = line;
    }

    reader.Close();
}

Это не работает, и я не знаю, почему. Я пытался использовать using StreamReader, я загружаю файл с URL-адреса и вижу в папке, что файл загружен. lastupdate.txt имеет размер 1 КБ.

Это мой текущий рабочий код с MessageBox. Если я уберу MessageBox, код не сработает. Нужно какое-то ожидание или я не знаю:

WebClient client = new WebClient();

client.DownloadFileAsync(new Uri(Settings.Default.patchCheck), "lastupdate.txt"); // ok

if(File.Exists("lastupdate.txt"))
{
    MessageBox.Show("Lastupdate.txt exist");
    using(StreamReader reader = new StreamReader("lastupdate.txt"))
    {
        string line;

        while((line = reader.ReadLine()) != null)
        {
            textBox1.Text = line;
            MessageBox.Show(line.ToString());
        }

        reader.Close();
    }

    File.Delete("lastupdate.txt");
}

person user1085907    schedule 24.02.2012    source источник
comment
textBox1.Text = текст? textBox1.Text += строка?   -  person shenhengbin    schedule 24.02.2012
comment
Вы уверены, что в то время как был выполнен и читатель имеет значение?   -  person Akrem    schedule 24.02.2012
comment
Что ты имеешь в виду? lastupdate.txt содержит данные 1 просто номер...   -  person user1085907    schedule 24.02.2012
comment
Поскольку вы загружаете Async, остальная часть кода будет пропущена. if(File.Exists) будет ложным, потому что файла еще нет или он используется потоком загрузки. Вот почему вы ничего не получаете в своем текстовом поле. Вам нужно настроить обработчик событий для работы с запросом Ansyc. Когда вы приостанавливаете выполнение своего кода с помощью MessageBox, вы разрешаете полную загрузку файла.   -  person CaptainBli    schedule 20.08.2014
comment
может быть, попробовать while (!reader.EndOfStream) и после этого присвоить значение ReadLine()?   -  person Muflix    schedule 02.12.2016


Ответы (5)


Пытаться :

StringBuilder sb = new StringBuilder();
using (StreamReader sr = new StreamReader("lastupdate.txt")) 
{
    while (sr.Peek() >= 0) 
    {
        sb.Append(sr.ReadLine());
    }
}
textbox.Text = sb.Tostring();
person Pranay Rana    schedule 24.02.2012

Если вам нужен текст в текстовом поле, гораздо эффективнее прочитать его целиком, а затем поместить в текстовое поле:

var lines = File.ReadAllLines("lastupdate.txt");
textBox1.Lines = lines; //assuming multi-line text box

or:

textBox1.Text = File.ReadAllText("lastupdate.txt");

Редактировать:

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

Если вы просто хотите, чтобы текстовая строка в файле не загружалась, используйте вместо этого DownloadString:

string text = "";
using (WebClient wc = new WebClient())
{
    text = wc.DownloadString(new Uri(Settings.Default.patchCheck));
}
textBox1.Text = text;
person BrokenGlass    schedule 24.02.2012
comment
что делать, если файл действительно очень большой? - person wal; 24.02.2012
comment
Тогда исходная версия еще хуже, поскольку пользовательский интерфейс будет завален запросами на обновление (даже если чтение выполняется в фоновом потоке). Если он действительно большой, чтение текста также должно выполняться в фоновом потоке. - person BrokenGlass; 24.02.2012
comment
@wal: если файл большой, то проблема с текстовым полем, содержащим все строки, и идея вопроса неверна. - person Akrem; 24.02.2012
comment
здорово, что вы согласны с Акрем @Ravia, как насчет того, чтобы поднять его комментарий вместо того, чтобы публиковать свой собственный бесполезный комментарий. я думаю, что его стоит упомянуть в ответе как заявление об отказе от ответственности, то есть «если ваш файл не большой, то это решение хорошее» - person wal; 24.02.2012
comment
что делать, если файл действительно очень большой? не 1кб - person user1085907; 24.02.2012
comment
@ user1085907: Исходя из вашего примера, это должно работать — что именно не работает? - person BrokenGlass; 24.02.2012
comment
Вы должны предоставить немного больше подробностей о том, почему это происходит - вы прошли код с помощью отладчика? Имя файла правильное? Он читает данные файла? Вы назначаете правильное текстовое поле? Никто не сможет предоставить вам более подробную информацию и решить вашу проблему за вас - работайте над этим. - person BrokenGlass; 24.02.2012
comment
хммм, когда в моем коде я ввожу время, он зависает или что-то в этом роде с после кода - person user1085907; 24.02.2012
comment
В коде, который я показал, не должно быть цикла while - он полностью заменяет ваш образец. - person BrokenGlass; 24.02.2012
comment
в 4.0 ReadLines лучше, чем ReadAllLines. - person amalgamate; 11.12.2014

Попробуй это :

using(StreamReader reader = new StreamReader(Path))
{
    string line =  reader.ReadLine();

    while(line != null)
    {
        textBox1.Text += line;
        line = reader.ReadLine()
    }

    reader.Close();
}
person Akrem    schedule 24.02.2012

Веб-клиент имеет довольно странный метод DownloadFileAsync. Тип возвращаемого значения недействителен, поэтому его нельзя ожидать. Кроме того, это означает, что мы даже не получаем Task, поэтому ContinueWith невозможен. Это оставляет нас с использованием события DownloadFileCompleted.

const string FileName = "lastupdate.txt";

private void DownloadLastUpdate() {
    var client = new WebClient();

    client.DownloadFileCompleted += ( s, e ) => {
        this.UpdateTextBox( e.Error );
        client.Dispose();
    };

    client.DownloadFileAsync( new Uri( Settings.Default.patchCheck ), FileName );
}

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

private void UpdateTextBox( Exception exception = null ) {
    textBox1.Text = string.Empty;

    if ( exception != null ) {
        textBox1.Text = exception.Message;
        return;
    }

    if ( !File.Exists( FileName ) ) {
        textBox1.Text = string.Format( "File '{0}' does not exist.", FileName );
        return;
    }

    var lines = File.ReadLines( FileName );

    textBox1.Text = string.Join( Environment.NewLine, lines );
}
person thestud2012    schedule 29.12.2013

приведенный выше ответ правильный, но в вашем фрагменте кода просто измените 1 строку:

textBox1.Text += line;
person mindandmedia    schedule 24.02.2012