web-dev-qa-db-ja.com

C#DownloadFileAsyncを使用してStreamReaderでファイルから行を読み取る

StreamReaderでファイルを読み取るときに問題が発生し、line != nulltextBox1に追加

コード:

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

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

    reader.Close();
}

それは機能しておらず、理由はわかりません。 using StreamReaderを使用してみましたが、URLからファイルをダウンロードすると、ファイルがダウンロードされたフォルダーに表示されます。 lastupdate.txtのサイズは1KBです。

これは、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");
}
7
user1085907

試してください:

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

テキストボックスにテキストが必要な場合は、すべてを読み、テキストボックスに入力する方がはるかに効果的です。

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;
8
BrokenGlass

これを試して :

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

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

    reader.Close();
}
3
Akrem

Webクライアントには、かなり奇妙なDownloadFileAsyncメソッドがあります。戻り値の型は無効であるため、待機できません。また、これはタスクも取得しないため、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 );
}
1
thestud2012

上記の答えは正しいですが、コードの一部では、1行を変更するだけです。

textBox1.Text += line;
0
mindandmedia