IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Problème avec la propriété EndOfStream


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Par défaut Problème avec la propriété EndOfStream
    Bonjour,
    Dans le cadre d'un projet pour ma société, je dois créer un petit exécutable qui récupère des e-mails sur un serveur pop, les écrire dans différents fichiers puis rediriger les fichiers dans certains dossiers. Jusque là, ça paraît plutôt simple.
    Afin de réaliser ce projet, j'ai effectué des recherches sur Google et il m'a semblé que l'utilisation d'un streamreader pour l'envoi, en binaire, des commandes POP était le plus simple à mettre en oeuvre.
    L'aboutissement de mes recherches donne ce petit bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    '//////////////////// Déclarations qui vont bien
    	'Initialisation du flux
            Strm = Sckt.GetStream
            'Initialisation du StreamReader
            StrmRdr = New StreamReader(Strm)
            Dim line As String = StrmRdr.ReadLine()
            If line.Substring(0, 3) = "+OK" Then
                CommandeUser = "USER " & strLogin & vbCr & vbLf
                'Envoi du login au serveur
                bCommande = System.Text.Encoding.UTF8.GetBytes(CommandeUser)
                Strm.Write(bCommande, 0, bCommande.Length)
     
                line = StrmRdr.ReadLine
                If line.Substring(0, 3) = "+OK" Then
                    CommandePass = "PASS " & strPass & vbCr & vbLf
                    'Envoi du mdp au serveur
                    bCommande = System.Text.Encoding.UTF8.GetBytes(CommandePass)
                    Strm.Write(bCommande, 0, bCommande.Length)
     
                    line = StrmRdr.ReadLine
                    If line.Substring(0, 3) = "+OK" Then
                        CommandeList = "RETR " & NumMessage & vbCr & vbLf
                        'Envoi de la commande de récupération du mail
                        bCommande = System.Text.Encoding.UTF8.GetBytes(CommandeList)
                        Strm.Write(bCommande, 0, bCommande.Length)
                        'Création d'un fichier texte
                        Dim SW As New StreamWriter(CheminBAL & "\cmessage" & NumMessage & ".txt")
                        line = StrmRdr.ReadLine
                        txtDEBUG.Text = line
                        If line <> Nothing Then
                            If line.Substring(0, 4) = "-ERR" Then
                                SW.WriteLine(line)
                            Else
                                'Parcourt et enregistrement de l'email dans le fichier
    			    '/////////////////////////////////////////// Lorsqu'il arrive à la dernière ligne d'un email, la lecture de la propriété EndOfStream est trés trés longue.
                                Do Until StrmRdr.EndOfStream
                                    SW.WriteLine(line)
                                    line = StrmRdr.ReadLine
                                Loop
                            End If
                        End If
                        SW.Dispose()
                        txtPatience.Text = "Reception terminée"
                    End If
                End If
            End If
            StrmRdr.Dispose()
            Strm.Dispose()
            Sckt.Close()
    Ce code fonctionne, c'est à dire qu'il me récupère bien le mail de numéro NumMessage mais par contre il est trés long, trés trés long (parfois plus de 2 mins).
    En debug, je me suis rendu compte que c'était la lecture de la propriété EndOfStream qui, lorsqu'il arrive à la dernière ligne du mail, est trés trés longue.

    Quelqu'un aurait une explication, une piste pour une méthode plus rapide ?

    Merci d'avance.

  2. #2
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Soit je te dis une grosse bêtise (parce que je n'utilise jamais de do until), soit ça va régler ton problème:

    Ton Do Until, va exécuter ton code et faire le test après, d'où ton problème sur la dernière ligne....

    Remplace par un Do While, et dis nous si ça marche mieux :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     While not StrmRdr.EndOfStream
                                    SW.WriteLine(line)
                                    line = StrmRdr.ReadLine
     End While

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Par défaut
    Tout d'abord, merci de ta réponse.

    Malheureusement la modification du en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    While Not ... End While
    ne change pas la donne.
    Je n'arrive pas à comprendre d'où vient le problème car j'utilise en parallèle ThunderBird pour accéder à la même boite mail et pourtant ThunderBird me récupère mes mails sans problème et beaucoup plus vite.

    Quelqu'un aurait une idée?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Par défaut
    Finalement mon ami google m'a donnée une réponse qui me satisfait a moitié, j'ai remplacé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                                Do Until StrmRdr.EndOfStream
                                    SW.WriteLine(line)
                                    line = StrmRdr.ReadLine
                                Loop
    par ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                                While line <> "."
                                    SW.WriteLine(line)
                                    line = StrmRdr.ReadLine
                                End while
    Il semblerait en effet que les e-mails se terminent par une ligne ne contenant qu'un point.

    Malgré tout, je n'arrive pas à trouver de confirmation de cela.
    Quelqu'un pourrait me fournir plus d'information ?
    Merci d'avance.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Un ReadToEnd()

    Ca ne marche pas?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Par défaut
    Malheureusement le ReadToEnd se comporte exactement comme le ReadLine autrement dit il est long, trés long...

    Merci quand même

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec la propriété filter
    Par Morgoth818 dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/08/2007, 21h20
  2. Problème avec la propriété "Filter" de mes DBLookupComboBox
    Par CleeM dans le forum Bases de données
    Réponses: 3
    Dernier message: 29/06/2007, 13h53
  3. problème avec la propriété rendered
    Par gaet_045 dans le forum JSF
    Réponses: 9
    Dernier message: 06/06/2007, 09h28
  4. [VBA_E] problème avec la propriété SelectedItem
    Par jamelie dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 17/04/2007, 06h09
  5. [Delphi 6] Problème avec la propriété Text d'un composant
    Par bionoir dans le forum Composants VCL
    Réponses: 4
    Dernier message: 08/12/2005, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo