C # чтение строки из файла с StreamReader с DownloadFileAsync - PullRequest
7 голосов
/ 24 февраля 2012

У меня проблема с чтением файла с 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");
}

Ответы [ 5 ]

13 голосов
/ 24 февраля 2012

Попробуйте:

StringBuilder sb = new StringBuilder();
using (StreamReader sr = new StreamReader("lastupdate.txt")) 
{
    while (sr.Peek() >= 0) 
    {
        sb.Append(sr.ReadLine());
    }
}
textbox.Text = sb.Tostring();
8 голосов
/ 24 февраля 2012

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

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

или:

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;
3 голосов
/ 24 февраля 2012

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

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

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

    reader.Close();
}
1 голос
/ 29 декабря 2013

Веб-клиент имеет довольно странный метод DownloadFileAsync.Возвращаемый тип void, поэтому он не является ожидаемым.Кроме того, это означает, что мы даже не получаем задачу, поэтому 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 );
}
0 голосов
/ 24 февраля 2012

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

textBox1.Text += line;
...