2012-02-24 2 views
7

Я имею проблему при чтении файла с StreamReader и в то время как line != null добавить в textBox1C# строки из файла чтения с StreamReader с DownloadFileAsync

Код:

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"); 
} 
+1

textBox1.Text = текст? textBox1.Text + = строка? – shenhengbin

+0

Вы уверены, что в то время как был выполнен и читатель имеет ценность? – Akrem

+0

Что вы имеете в виду? lastupdate.txt содержат данные «1» только номер ... – user1085907

ответ

13

Try:

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

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

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

или:

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

Edit:

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

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

string text = ""; 
using (WebClient wc = new WebClient()) 
{ 
    text = wc.DownloadString(new Uri(Settings.Default.patchCheck)); 
} 
textBox1.Text = text; 
+1

что делать, если файл действительно большой? – wal

+1

Тогда исходная версия еще хуже, так как пользовательский интерфейс будет загружен запросами обновления (даже если чтение выполняется на фоновом потоке). Если он действительно большой, чтение текста должно выполняться и в фоновом потоке. – BrokenGlass

+4

@wal: если файл большой, тогда проблема с текстовым полем, чтобы содержать все строки, и идея вопроса неправильная – Akrem

0

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

textBox1.Text += line; 
+0

dont working :( – user1085907

+0

Что не работает? Вы уверены, что у вас есть '+ ='? – mindandmedia

3

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

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

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

    reader.Close(); 
} 
+0

тоже не работает: '( – user1085907

1

веб-клиент имеет довольно причудливую DownloadFileAsy nc. Тип возврата недействителен, поэтому он не является ожидаемым. Кроме того, это означает, что мы даже не получаем задачу, поэтому 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); 
}