Syntaxe avec StreamReader

Signaler
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
19 novembre 2011
-
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
19 novembre 2011
-
Bonjours à tous

J'ai un soucis dont je n'arrive pas à me défaire, bien qu'ayant tout essayé, me semble-t-il. Voilà mon début de code :


        Dim FileString As String =   String.Empty
        Dim FichierIni As String = My.Resources.Repart

        Dim fr = New System.IO.StreamReader(FichierIni, System.Text.Encoding.Default, True) '   <---- C'est ici que le déboggeur me dit que la syntaxe n'est pas bonne  

        Try            

            Do
                FileString   = fr.ReadLine
                If Not FileString = "" Then



Mais si je fais :


        Dim FileString As String = String.Empty
        Dim FichierIni As String = "D:\MonAppli\Appli1\Projet\resources\Repart.txt"

        Dim fr = New System.IO.StreamReader(FichierIni, System.Text.Encoding.Default, True)

        Try            

            Do
                FileString = fr.ReadLine
                If Not FileString = "" Then



tout se passe bien... Vous l'avez compris, je veux utiliser mon fichier directement depuis mes ressources (sinon il ne sert à rien de l'y ranger). D'autre part, je ne peux pas savoir d'avance le chemin où seront rangés les fichiers de l'utilisateur.

Quelqu'un aurait une idée ?

Cordialement,

Whombat.

Prédire l'avenir est particulièrement aléatoire, 
surtout lorsqu'il s'agit du futur.

21 réponses

Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
19 novembre 2011

Suite au premier message :

En fouillant un peu, j'ai trouvé ça (en dessous), et je me suis dis "c'est gagné !" eh bien non, le déboger me bloque en me disant : "Caractères non conformes dans le chemin d'accès"

Voilà le nouveau code :


        Dim FileString As String = String.Empty
        Dim FichierIni As String = My.Application.Info.DirectoryPath & My.Resources.Repart

        'c'est cette ligne qui bloque  
        Dim fr As StreamReader = New System.IO.StreamReader(FichierIni, System.Text.Encoding.Default, True)


        Try            
            Do
                FileString = fr.ReadLine
                If Not FileString = "" Then
                    ..................
 


Donc, toujours pas de solution en vue.
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
Salut

D'autre part, je ne peux pas savoir d'avance le chemin où seront rangés les fichiers de l'utilisateur.




pas clair si l'utilisateur doit charger le fichier d'un dosssier soi avec le openfiledialog
donc tu peux savoir le chemin

My.Application.Info.DirectoryPath 

ce n'est pas le répertoire resource
mais
C:\XXX\bin\Debug
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
4
Bonjour,

Dim ligne As String
Dim p1 As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & 
"\nomFichier.txt"))
While p1.Peek() >= 0 ' lecture
ligne = p1.ReadLine()
End While
p1.Close()


Cordialement, Joe.
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
19 novembre 2011

Merci pour vos réponses.

Effectivement, j'ai le répertoire de l'exe, pour autant que l'utilisateur ne modifie pas les autres. Ce qui ne me rejouis qu'à moitié car ce répertoire fini à bin\debug et que desources est dans une branche parallèle. A moins que VB ait prévu dans ses fonctions application.Info.Dir... le rep des resources, (j'ai pas trouvé)...

Mais, cela voudrait dire que j'appelle le fichier par son nom, "machin.txt", autant faire un sous-répertoire debug\data\ et y mettre toutes mes données (images, sons et txt) qui devraient être dans les resourses. Pas cohérent...

Non, je voudrais me servir des resources comme on doit s'en servir. Et comme on s'en sert par exemple avec l'icone de l'application :


MainNotifyIcon.Icon = My.Resources.Courbe



sinon (je me répète, je vieillis...) les resources ne servent à rien, ce qui m'étonnerait beaucoup..
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Statut
Membre
Dernière intervention
17 novembre 2012
5
Bonjour,

Ce que tu veux c'est, si j'ai bien compris, c'est lire un fichier texte placé en Ressource sans que ce fichier ne soit copié et n'apparaisse sur le disque.

J'ai une solution, mais pour une fichier non pas placé en Ressource, mais incorporé au projet (le fichier est dans ce cas compilé en même temps que le programme et intégré à celui-ci).

1) Faire glisser le fichier en question dans la fenêtre de l'Explorateur de Solutions.
2) Cliquer sur sa représentation et, dans les propriétés, choisir pour Action de génération, Ressource incorporée.
3) Pour le lire, utiliser le code ci-dessous :
  Private Function LireFichierTexteIncorpore(ByVal FichierIncorpore As String) As String()
        'NE PAS OUBLIER D'INCORPORER LE FICHIER AU PROJET
        'POUR CELA SELECTIONNER LE FICHIER DANS L'EXPLORATEUR DE SOLUTION PUIS PROPRIETE/ACTION DE GENERATION = RESSOURCE INCORPOREE
        Dim fluxEntree As System.IO.Stream = _
            Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream(My.Application.Info.AssemblyName & "." & FichierIncorpore)
        Dim fluxLecture As New System.IO.StreamReader(fluxEntree, System.Text.Encoding.Default)
        Dim lignesTexte As String() = Nothing
        Dim index As Integer = 0
        Do
            If fluxLecture.EndOfStream = True Then
                Exit Do
            Else
                Dim chaine As String = fluxLecture.ReadLine
                Array.Resize(lignesTexte, index + 1)
                lignesTexte(index) = chaine
                index += 1
            End If
        Loop
        Return lignesTexte
    End Function
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
4
Ohhhhhh...

La configuration que tu as en mode debugage n'est pas la même qu'une fois terminée, une fois distribué l'exe lit par défaut dans le répertoire où il se trouve, ce qui à mon sens est le meilleur endroit pour mettre les fichiers, mais en mode debug évidemment, pour avoir l'équivalent il faudra mettre les fichiers dans BIN comme tu l'as vu, ce qui équivaut au répertoire par défaut après.

Donc l'organisation du mode debugage n'est pas la même que celle de l'exe distribué au final, toutefois, notes que tu peux changer le répertoire par défaut et mettre l'exe à l'endroit des feuilles du projet, ce qui retracera davantage la réalité de ce qui se passera une fois fini, si ça te semble plus rassurant...

Les ressurces servent à emballer dans l'exe des éléments constants, ce qui rpésente lavantage de ne pas avoir à installer ensuite et les fichiers constants et l'exe, on installe juste l'exe, mais évidemment en mode debuggage encore une fois, c'est différent, et en effet on peut ne pas voir l'intérêt des ressources, tu le verras ensuite lors de la confection de la distribution...

Cordialement, Joe.
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
19 novembre 2011

Ton explication sur le pourquoi du comment m'a ouvert les yeux sur les paramètres, des phénomènes, que j'ignorais, EhJoe. Mais ça me dit pas comment me servir d'un fichier texte qui est dans les resources. Le lire au moins car, il m'étonnerait qu'on puisse y écrire : quand c'est compilé c'est immuable, non ?

Ta solution, mdevaux62, se rapproche déjà de la vérité sans y parvenir, me semble-t-il. En effet, ce que devient le fichier texte lorsque je l'appelle :



c'est lire un fichier texte placé en Ressource sans que ce fichier ne soit copié et n'apparaisse sur le disque



ça m'est un peu égal. Je veux juste le lire comme je fais avec mes icônes.
Et comme l'explique mon premier message et ses exemples -> il y a une formule qui marche mais en nommant le fichier et son chemin.

En passant par les resources, uniquement si c'est du texte (!!!) car pour le reste ça fonctionne (ico, bmp, wav, etc...), ça bugue. Il doit pourtant bien y avoir une technique pour lire un fichier txt des resources !

Cordialement,
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
4
Cher whombat,

On ne peut pas en effet, sauf ruse que je ne connais pas, on ne peut pas une fois installé, compilé... modifier les ressources, alors de facto un fichier mis en ressource est comme tout autre élément, une constante.

On peut faire ce qu'on veut avec les ressources, soit le lire simplement depuis la ressource, soit le copier sur disque, et là l'écrire et le lire, le supprimer, le renommer, le copier, mais on ne pourra pas l'intégrer ensuite en ressource, il restera un fichier joint à l'endroit où on l'aura mis (ce qui ne fera pas non plus perdre l'original en ressources).

Nonobstant, espérant ne pas apporter moult confusions, si jamais tu copies sur disque un fichier issu des ressources, puis que tu modifies ce fichier, et que plus tard tu écris de nouveau ton fichier ressources à nouveau sur disque, il écrasera l'autre, avec une messsage je crois (priorité à l'entrant, au nouveau, toujours)...

Pour commencer par le boeuf et non la charrue.

- Combien de lignes contient ton fichier txte ?
- Tu veux le lire, ou l'écrire (écrire implique ipso facto la lcture) ?
- Dans quoi veut-tu le voir figurer une fois affiché (form, objet, ou bloc-notes, et caetera) ?

Quand tu auras répondu à ces trois questions, à notre tour nous pourrons mieux te répondre...

Cordialement, Joe.
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
19 novembre 2011

Cher HeJoe, ta réponse me va bien. Elle confirme ce que je subodorais.

Pour répondre, j'ai plusieurs fichiers texte qui, par exemple, servent à remplir un listview, un combo, ou qui servent de données sur des constantes comme les mois (Janvier, Février), les jours (Lundi, Mardi), etc...

Donc, je n'ai pas besoin de les copier sur le disque ou de les bouger de place. Juste les lire me suffirait. Et je les ai mis dans les Resources pour toutes les raisons qui font qu'on préfère, quand c'est possible et le plus possible, mettre toutes ses 'ressources' dans les Resources.

Et puis c'est nickel. Plus besoin de chercher le path. Quel que soit le déploiement, la ligne c'est (pour un fichier qui s'appelle "Repart.txt" :


Dim FichierIni As String = My.Resources.Repart

        Dim fr = New System.IO.StreamReader(FichierIni, System.Text.Encoding.Default, True) 



Oui, mais voilà...
Cordialement,
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Statut
Membre
Dernière intervention
17 novembre 2012
5
Ben alors, au lizu de mettre le fichier en ressource, créé plutôt une ressource Chaine que tu appelleras "Repart" et qui contiendra tout le contenu de ton fichier Repart.

Dans ton code tu l'appelleras de la façon suivante :
dim chaine as string = My.Resources.Repart
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
19 novembre 2011

Bien que je tienne absolument, ne srait-ce que pour comprendre pourquoi ça coince , mettre mes fichiers txt dans les Resources, je ne suis pas à priori ennemi de ta suggestion.

Mais... Comment faire à l'écriture et surtout à la lecture. La lecture, pour un fichier, c'est simple : c'est ligne à ligne mais pour une seule chaîne où tout est bout à bout...

Cordialement,
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
4
Testé :

Option Explicit On
Public Class Form1
  ' déclarer 3 objets sur form1
  ' TextBox1 + propriété Multiline = True
  ' Listbox1
  ' Button1
  Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim f As String = My.Application.Info.DirectoryPath & "\Repart.txt"
    ' depuis ressource, copie fichier sur disque
    System.IO.File.WriteAllText(f, My.Resources.Repart)
    ' Lit le fichier sur disque et le met en double dans textbox1 et listbox1
    TextBox1.Text = ""
    ListBox1.Items.Clear()
    Dim a As String
    Dim p As New System.IO.StreamReader(CStr(f))
    While p.Peek() >= 0 ' lecture
      a = p.ReadLine()
      If a <> "" Then
        TextBox1.Text = TextBox1.Text & a & vbCrLf
        ListBox1.Items.Add(a)
      End If
    End While
    p.Close()
    Kill(f)
  End Sub
End Class


Cordialement, Joe.
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
19 novembre 2011

Super merci HeJoe.

Je vais lâchement copier ce bout de code. J'en ferai une fonction et Zou...!

La conclusion, car je suppose que tu as réfléchi aussi au problème, c'est qu'à la différenbce du son ou de l'image, le texte dans les Resources n'est pas accessible directement.

Je n'aurai pas pensé à ta solution (trop débutant) pas plus qu'à la façon de la mettre en oeuvre (pour la même raison) alors, encore une fois, merci.

Juste un truc : peux-tu me dire la différence qu'il y a entre :


While p.Peek() >= 0 
......
End While 

'd'une part et 

Do
.......... 
Loop while a Is Not Nothing 

'd'autre part ? Merci.



Cordialement,

Whombat.
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
4
Cher whombat,

Le code était là pour être copié, sinon ce n'est pas la peine de le faire

Ben, c'est-à-dire que les fichiers texte sont stockés sous forme binaire je crois, pour gagner de la place, alors on pourrait visualiser la ressource mais ce serait illisible ou presque, raison pour laquelle évidemment, on retranscrit en texte ; peut être y a-t-il une façon de le faire rien qu'en mémoire, mais je ne sais pas.
Ce genre de détail n'a de l'importance qu'avec des fichiers monstreux en taille, où on gagne quelque secondes en passant en mémoire, alors je suis passé par le disque, peu importe

In fine (pour le moment), pour les chaînes NoThing est égal = "", sauf dans les cas où la syntaxe oblige "noThing".

Pour la boucle, dans le premier cas le test est éffectué en début de boucle, donc ça s'arrête immédiatement si besoin, tandis que dans le second cas le test est éffectué à la fin de la première lecture, donc si la condition n'est pas réalisée ça va planter (on peut mettre (on devrait), une gestion d'erreur).
Généralement on teste en début, mais il y a des cas où on veut quand même lire au moins une fois sans tester, ce qui fait utiliser la seconde boucle, je n'ai pas d'exemple en tête, mais ça m'est déjà arrivé d'en avoir besoin.

En dernier, mon test n'est pas parfait, car j'élimine ainsi les lignes vierges que l'utilisateur pourrait avoir mis et vouloir conserve (chaine vide = ""), de facto l'idéal serait de tester une fois en comptant, puis une seconde fois en copiant selon le nombre précédemment trouvé, sauf si la dernière ligne est vide, car souvent dans les fichiers texte on se retrouve avec une ligne vide en fin, ce qui fait planter si l'erreur n'est pas piégée, ce qui est le cas ; donc j'ai oté sans distinction toute les lignes vides pour cette raison, sachant que manifestement tu n'avais ps besoin de lignes vides, sinon il faut faire comme susdit.

Cordialement et au plaisir.

Joe.
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
19 novembre 2011

Merci pour tout, Joe.

Cordialement,

Whombat.

P.S. J'ai essayé le code, adapté à mon cas bien sûr, et c'est nickel chrome, comme on disait dans la réclame.
Messages postés
2811
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
26 novembre 2013
27
Bonjour,

Une infos aussi, tu peux utiliser les paramètres d'applications qui seront peut être plus adaptés à tes besoins. Les paramètres d'applications se créent depuis le menu "My Project" onglet "Paramètres".

Le principe: tu crée un schéma de paramètres (nom, type) et VB s'occupe de tout. Les paramètres sont sérialisés dans un fichier XML dont le chemin est géré par l'application. Il ne te reste plus qu'à définir la valeur de tes variable.

My.Settings.MaVariable = "Toto"
My.Settings.Save

Dim Toto As String = My.Settings.MaVariable


Sachant que les paramètres définis peuvent être de n'importe quel type marqué par l'attribut "<Serializable>".

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
19 novembre 2011

Merci Mayzz pour ces infos. J'ai vu, en survol, pas mal de conseils sur ces paramètres, je vais sûrement m'y mettre mais j'avance par étape. Et quand on vient du VB 4 c'est pas simple.

Cordialement,

Whombat.

Prédire l'avenir est particulièrement aléatoire, 
surtout lorsqu'il s'agit du futur.
Messages postés
2811
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
26 novembre 2013
27
Ah oui, c'est sûr qu'il y a de profonds changements avec .Net par rapport aux anciennes versions. Je suis passé par la aussi j'ai codé en vb6 aussi j'ai eu du mal à me faire à .Net mais on ne s'en passe plus.

Pour ma précédente réponse j'ai du t'embrouiller un peu alors je vais t'expliquer cela plus clairement. Il suffit de cliquer sur l'icône "My Project" puis d'aller à l'onglet "Paramètres". Tu auras une liste ou tu pourras à la main définir les variables globales pour ton application. Une fois la variable saisie et le projet enregistré, cette variable est directement accessible depuis l'ensemble de ton projet. Lors ce que tu saisie My.Settings l'intellisense te liste les variables définies. Il faut juste appeler My.Settings.Save pour enregistrer les modifications.

Voila, juste au cas ou.

++

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
188
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
19 novembre 2011

Ah oui, présenté comme ça c'est plus clair et parfaitement simple.

C'est pour ça, certainement, que les bon codeurs expliquent qu'il ne devrait jamais y avoir de variables globales dans un module. En fait c'est parce qu'on les passe en Paramètres... L'un remplaçant l'autre au fond.

Et ça fonctionne aussi pour les tableaux ? Remarquez, je vais essayer et je verrais bien.

Et je suppose que VB ne plafonne pas le nombre de paramètres, sauf à la mémoire du PC bien sûr ?

Maintenant que j'ai compris, je vais m'en servir. C'est sûr.

Cordialement,

Whombat.
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
4
Bonjour,

En fait tu as le même résultat pour une variable non indicée en écrivant (VB4, 5, 6 et Net) :

Public maVariable as string ' par exp, comme une globale

On déclare ça en form de démarrage qui est généralement la n°1, et on utilise ainsi :

dans la form de déclaration
maVariable = "bonjour"

Dans les autres forms (si origine = form1 ici)
form1.maVariable = "bonjour"

Pour ma part, pour ceux qui viennent de vb4 16/32 5 et 6, ça existe ainsi, je ne vois pas pourquoi ils se donneraient une peine inutile à apprendre des redondances

Cordialement, Joe.