web-dev-qa-db-fra.com

C # lit la ligne du fichier avec StreamReader avec DownloadFileAsync

Je rencontre un problème pour lire le fichier avec StreamReader et pendant que line != null j'ajoute à textBox1

Code:

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

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

    reader.Close();
}

Cela ne fonctionne pas et je ne sais pas pourquoi. J'ai essayé d'utiliser using StreamReader, j'ai téléchargé le fichier à partir de l'URL et je peux voir dans le dossier que le fichier est téléchargé. Le lastupdate.txt a une taille de 1 Ko.

Ceci est mon code de travail actuel avec MessageBox. Si je supprime la MessageBox, le code ne fonctionne pas. Il faut attendre ou je ne sais pas:

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

Essayez: 

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

Si vous voulez le texte dans la zone de texte, il serait beaucoup plus efficace de tout le lire et de le mettre ensuite dans la zone de texte:

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

ou:

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

Modifier:

Après la dernière mise à jour - vous téléchargez le fichier de manière asynchrone - il peut même ne pas être là, que partiellement là ou dans un état intermédiaire entre l'exécution du code. 

Si vous voulez juste que la chaîne de texte dans le fichier ne la télécharge pas, utilisez plutôt DownloadString:

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

Essaye ça :

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

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

    reader.Close();
}
3
Akrem

Web Client utilise une méthode DownloadFileAsync plutôt bizarre. Le type de retour est nul, il n'est donc pas attendu. De plus, cela signifie que nous n’avons même pas reçu de tâche, il est donc impossible de continuer avec. Cela nous laisse avec l'utilisation de l'événement 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 );
}

Je suis allé avec un paramètre d'exception facultatif pour relayer tous les messages d'exception. N'hésitez pas à refactoriser à votre guise. File.ReadLines génère du texte ligne par ligne, les fichiers volumineux ne doivent donc pas utiliser beaucoup de mémoire.

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

la réponse donnée ci-dessus est correcte, mais dans votre code, changez simplement 1 ligne:

textBox1.Text += line;
0
mindandmedia