Problème pour les fans de StreamReader

ojojoj - 22 févr. 2013 à 19:03
 ojojoj - 22 févr. 2013 à 21:42
Bonjour, à tous. J'ai un problème de débutant INCOMPREHENSIBLE.

Je souhaite lire une htm grace a sr.reader() qui va lire les lignes d'un fichier texte ou une page html si vous bouclez la fonction (j'ai utilisé un do loop).
Mon algo fonctionnait bien jusqu'à ce que je dusse le mettes dans un else, qui est encore à l'intérieur d'une autre boucle(pour se déclencher une autre fois; je peux ainsi comparer des fichiers listés contenus dans un htm et une liste de fichiers d'un répertoire).

Impossible de comprendre pourquoi, lors d'un second passage, mon StreamReader, qui pourtant RElis la MEME liste, vaut "nothing"(valeur de fin de lecture du premier passage).
Or...il ne devrait pas car je le REdeclare puis le REinitialise.

Je souffre, help...

Mon code (un peu plus simplifié):
Dim srUpdateHtm As StreamReader = New StreamReader(ToPath & "\update.htm")
        For Each f As System.IO.FileInfo In x.Files
            If bUpdateUncreated = True Then

                AddLog("New file detected ")
             
            Else
                Dim bSameChecked As Boolean
                Dim line As String
                Do
                    line = srUpdateHtm.ReadLine() 'Lors du deuxieme passage
                                                  'line = nothing
                    bSameChecked = False
                    Dim linesplitee As String()

                    If Not line = Nothing AndAlso (line.StartsWith("") AndAlso Not (line.StartsWith("&nbsp"))) Then

                        linesplitee = line.Split("|")

                        If (linesplitee(2) f.ToString AndAlso Not (linesplitee(5) f.LastWriteTime.ToString)) Then
                          
                            AddLog("Modified file detected ")                    
                            bSameChecked = True

                        End If

                        If linesplitee(2) = f.ToString Then

                            bSameChecked = True

                        End If

                    End If

                Loop Until line Is Nothing

                If bSameChecked Then
                    AddLog(vbCrLf)
                    AddLog("New file detected ")
                End If
            End If
        Next
        srUpdateHtm.Close()

11 réponses

Utilisateur anonyme
22 févr. 2013 à 19:43
Bonsoir,

Je ne sais pas ce que tu veux exactement faire avec ce code puisque tu ne le sais pas très bien toi-même
Ton StreamReader n'est affecté qu'a ton fichier 'update.htm'. Une fois lu par ta boucle, ... plus rien.
Si tu souhaites lire le contenu de ta collection x.Files (la vérité est ailleurs), il faudrait instancier ton streamreader après l'instruction For en l'affectant à ta variable f.
0
o.O D'accord...en plus de m'insulter, tu réponds pas a ma question

Mon streamReader n'est effectivement pas affecté a autre chose que mon update.htm, c'est fait pour.
Ce streamReader va parcourir ce fichier et produire une liste de chaînes(étant des informations sur des fichiers, dont leurs noms, date de mod, ...)
Je compare, grace a un objet file.info, ces listes de fichiers avec mon objet.
Cela n'est pas vraiment important.
L'important a retenir est :
l'entrée dans une boucle foreach,
puis, à l'intérieur d'un else,
on entre alors dans une autre seconde boucle do loop pour parcourir le reader.

le problème :
Lors de son deuxieme passage (dans la boucle foreich),
la valeur (entre guillemets) est 'nothing'.

Du coup,
Le "do loop Until line Is Nothing "ne reboucle pas
puisque line est à nothing.

Est-ce que je me suis fais comprendre ( car c'est vrai mon premier message était loin d'être clair, je m'en excuse)?
0
Utilisateur anonyme
22 févr. 2013 à 20:23
o.O D'accord...en plus de m'insulter, tu réponds pas a ma question

Je ne vois pas du tout où....

Oh et puis non tiens, je passe la main à qui voudra...
0
Autant pour moi.
Ce que je devais comprendre dans ta réponse (ou pas...),
C'est qu'une fois lu garce a la boucle do loop, on ne peut plus l'utiliser?
On serait donc obligé de redéclarer+instancier le streamreader pour le relire...?
J'ai poser la ligne
Dim srUpdateHtm As StreamReader = New StreamReader(ToPath & "\update.htm")

juste apres le foreich,
puis le
 srUpdateHtm.Close()
, a l'interieur de la boucle foreich (a la fin). Du coup évidement ca marche...
Mais cela reste imcomprehensible pour moi car c'est une liste de string, qui normalement selon sa definition est Enumerable donc peut etre lu par un foreich (ET PAS QU'UNE SEULE FOIS, WTF?!)


Merc de tout coeur de m'avoir répondu.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
22 févr. 2013 à 20:33
Ton code fait de multiples accès au disque ce qu'il faut éviter. Tu devrais ajouter les lignes de ton fichier update à une List(Of String) et comparer les infos depuis cette liste.
0
Exactement ce que je voulais faire, mais je ne connais pas à l'avance le nombre de ligne, donc de string à ranger dans la liste. Donc je ne peux instancier mon tableau de string(list of string).

Du moins, c'est ce que je crois. J'espere que j'ai tort...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 févr. 2013 à 21:10
Bonjour,
J'espere que j'ai tort.
Sois donc rassuré : tu as tortr.
Dès lors que la totalité de ton fichier texte est dans une variable string, elle est analysable, "sécable", etc ...



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Oui mais est-ce que je peux créer un tableau de string (pour ranger mes noms de fichiers par exemple) si je ne connais le nombre de cases à alouer?
0
Utilisateur anonyme
22 févr. 2013 à 21:31
Tu peux charger ton fichier dans ta liste de cette façon :
Dim MaListe As New List(Of String)
MaListe.AddRange(IO.File.ReadAllLines("update.txt"))

De plus MaListe.Count donne le nombre de lignes.
0
Utilisateur anonyme
22 févr. 2013 à 21:34
MaListe(1) par exemple renvoie la deuxième ligne de ton fichier.
0
Nice. Ca sent le professionalisme.
C'est exactement ce qu'il me fallait. Ca devrait racourcir le temps d'execution du programme.
Super.
Merci encore et bon week end.
0
Rejoignez-nous