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 :

Comment lire un fichi ini sous Windows CE


Sujet :

VB.NET

  1. #1
    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 Comment lire un fichi ini sous Windows CE
    Bonjour a tous.

    J'ai effectuer quelque recherche mais les résultats sont plutôt contradictoire. Je fais donc appel a vous.

    Je developpe un logiciel pour PDA fonctionnant sous Windowz CE. Or je dois lire mes parametres de connexions dans un fichier *.ini (cahier des charges)

    J'ai essayé d'utilisé des fonctions déjà écrite qui utilise par exemple GetPrivateProfileString qui utilise kernel32.dll. Or j'ai lu que ce dll n'est pas présent dans Windows CE.

    J'ai lu également des personnes qui parlent d'utiliser GetProfileString, mais ceci est destiné a la base de registre.

    Donc ma question est simple, existe t il un moyen pour lire ce fichier? Merci d'avance de m'aider a me dépatouiller.

  2. #2
    Membre éclairé Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Par défaut
    Salut,

    Fais une recherche dans le forum, avec les mots suivants :

    [Fichiers .INI] Comment les lires correctement?
    ou quelque chose de ce genre.

    Un poste bien détaillé reprend ton problème avec au moins deux solutions (deux classes).

    Bonne chance.

  3. #3
    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
    Merci de ta reponse.

    Mais malheureusement non ca ne reponds pas a mon probleme. Moi je parle de lire les fichiers ini pour une application pour Windows CE.

    Les classes que tu utilises dans ce post utilise les fonctions comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Ansi Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivatePro
    Or Windows CE ne prends pas en charge le Dll kernel32.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    J'ai posté il y a quelque temps une implémentation 100% .NET (sans appel à des fonctions win32)

    Ca devrait marcher sans problème sous Windows CE

    Par contre c'est du C#... Donc soit tu le convertis en VB.NET (manuellement ou à l'aide de ce convertisseur), soit tu compiles ça dans un projet DLL en C# que tu références à partir de ton programme VB.NET

  5. #5
    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 reponse
    Merci énormément de ta réponse et source...

    Je vais voir ce qui est le plus simple pour moi, convertir ou utilisé en DLL.

    Je vais faire des tests et je clôturerai la discussion avec les résultats.

  6. #6
    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 complication
    Alors j'ai tout d'abord adopter la solution de créer la DLL. J'ai donc créer mon projet en C#, copier la DLL, que j'ai importer dans mon projet.

    Et ca avais l'air de bien marcher. Le problème fut que lorsque j'essayais de lancé l'application en Debug, sur mon PDA (qui a peut de mémoire) j'avais une erreur qui disait que j'avais pas assez de mémoire justement.

    J'ai alors constaté qu'il copiait plein plein plein de DLLs. Dans les références, j'ai donc supprimer toutes les références inutilisé. Mais rien n'y fait, il me copie des DLL qui ne sont même pas dans les références, genre System.security.dll, System.data.sqlxml.
    Donc la je comprends pas.

    Qu'a cela ne tienne, j'ai utilisé le traducteur. J'ai tout bien adapter, hélas il me trouve une erreur que je ne saurais réparer je pense:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (m = regexSection.Match(line)).Success
    avec l'erreur:

    Erreur 104 L'opérateur '=' n'est pas défini pour les types 'System.Text.RegularExpressions.Match' et 'System.Text.RegularExpressions.Match'.
    Est il possible qu'il n'est pas su traduire ceci est l'a laissé tel quel comme en C#?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    pas assez de mémoire
    Il est gros comment ton fichier INI ?

    Citation Envoyé par mactwist69 Voir le message
    J'ai alors constaté qu'il copiait plein plein plein de DLLs. Dans les références, j'ai donc supprimer toutes les références inutilisé. Mais rien n'y fait, il me copie des DLL qui ne sont même pas dans les références, genre System.security.dll, System.data.sqlxml.
    Donc la je comprends pas.
    J'ai jamais fait de dev sur Win CE, mais a priori je dirais que c'est des assemblies standards du compact framework, non ? Donc tu ne dois pas les supprimer...

    Citation Envoyé par mactwist69 Voir le message
    Qu'a cela ne tienne, j'ai utilisé le traducteur. J'ai tout bien adapter, hélas il me trouve une erreur que je ne saurais réparer je pense:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (m = regexSection.Match(line)).Success
    avec l'erreur:



    Est il possible qu'il n'est pas su traduire ceci est l'a laissé tel quel comme en C#?
    Oui, c'est très possible... il est un peu pourri ce traducteur

    Voilà une traduction du bloc de code qui doit poser problème :
    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
     
    			While (line = rd.ReadLine()) <> Nothing
    				If line.Trim().StartsWith(";") Then
    					Continue
    				Else
    					m = regexSection.Match(line)
    					If m.Success Then
    						curSection = m.Groups(1).Value
    					Else
    						m = regexKeyValuePair.Match(line)
    						If m.Success Then
    							Dim key As String = m.Groups(1).Value
    							Dim value As String = m.Groups(2).Value
    							Dim dSection As Dictionary(Of String, String) = Nothing
    							If Not Sections.TryGetValue(curSection, dSection) Then
    								dSection = AddSection(curSection)
    							End If
    							dSection.Add(key, value)
    						End If
    					End If
    				End If
    			End While
    En fait c'est pas seulement le traducteur qui est un peu pourri, mais aussi le langage VB.NET

    Comme il utilise le même symbole pour l'affectation et le test d'égalité, il est perdu quand on fait un truc bizarre du genre :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((m = regexSection.Match(line)).Success)
    Ce qui veut dire : affecter à m le résultat de regexSection.Match(line), et tester la propriété Success de ce résultat. VB.NET ne permet pas de faire ça en une seule instruction, donc il faut bidouiller

    EDIT: par contre, te fait pas trop d'illusion... il n'y a pas de raison que ça marche mieux en VB.NET qu'en C#...

  8. #8
    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 Reponse
    Alors, J'avais eu quelque erreurs due je pense a la traduction qui laisse passé des petites failles. Par exemple il traduisait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public string FileName { get; set; }
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Public Property FileName() As String
            Get
            End Get
            Set(ByVal value As String)
            End Set
    End Property
    Et ca ne marchais pas. Également dans ta une fonction tu prends en paramètre comme path du fichier la variable fileName Et tu as en variable de classe FileName. Or pour VB.Net Les deux variables sont les mêmes (ne prends pas en compte les majuscules)

    Ensuite Il y avais une deuxième erreur comme celle que tu m'as corriger a savoir remplacé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    While (line= rd.ReadLine()) <> Nothing
    End While
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    line = rd.ReadLine()
     While (line) <> Nothing
             line = rd.ReadLine()
    End While
    Et enfin, un autre petit problème, lorsque j'avais écris mon fichier INI j'avais laissé une ligne vide. Or quand la fonction Reload passe dans le fichier il s'arrête a une ligne vide, donc j 'ai changer mon fichier.

    Donc pour finir je poste le code finale en VB.NET qui fonctionne très bien pour moi, Encore Un très grand merci a Tomlev:


    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    Imports System.Text.RegularExpressions
    Imports System.IO
     
     
    Public Class IniFile
     
        Private ReadOnly regexSection As Regex = New Regex("\s*\[([\w\s]+)\]", RegexOptions.Compiled)
        Private ReadOnly regexKeyValuePair As Regex = New Regex("\s*(\w+)=(.*)", RegexOptions.Compiled)
     
        Public FileName_ As String
        Public Sections As Dictionary(Of String, Dictionary(Of String, String))
     
        Public Sub New()
            Try
     
                Sections = New Dictionary(Of String, Dictionary(Of String, String))()
     
            Catch ex As Exception
                logs(ex.Message)
                Throw
            End Try
        End Sub
        Public Sub New(ByVal fileName As String)
            Try
     
                FileName_ = fileName
                Reload()
     
            Catch ex As Exception
                logs(ex.Message)
                Throw
            End Try
        End Sub
     
        Default Public Property ConvertedIndexer(ByVal section As String, ByVal key As String) As String
            Get
                Return GetValue(section, key)
            End Get
            Set(ByVal value As String)
                SetValue(section, key, value)
            End Set
        End Property
     
     
        Public Sub Reload()
            Try
     
                If FileName_ = Nothing Then
                    Throw New InvalidOperationException("The file name is not defined")
                End If
     
                Sections = New Dictionary(Of String, Dictionary(Of String, String))()
                Using rd As StreamReader = New StreamReader(FileName_)
                    Dim curSection As String = ""
                    Dim line As String
                    Dim m As Match
                    line = rd.ReadLine()
                    While (line) <> Nothing
                        If line.Trim().StartsWith(";") Then
                            Continue While
                        Else
                            m = regexSection.Match(line)
                            If m.Success Then
                                curSection = m.Groups(1).Value
                            Else
                                m = regexKeyValuePair.Match(line)
                                If m.Success Then
                                    Dim key As String = m.Groups(1).Value
                                    Dim value As String = m.Groups(2).Value
                                    Dim dSection As Dictionary(Of String, String) = Nothing
                                    If Not Sections.TryGetValue(curSection, dSection) Then
                                        dSection = AddSection(curSection)
                                    End If
                                    dSection.Add(key, value)
                                End If
                            End If
                        End If
                        line = rd.ReadLine()
                    End While
                End Using
     
            Catch ex As Exception
                logs(ex.Message)
                Throw
            End Try
        End Sub
        Public Function AddSection(ByVal name As String) As Dictionary(Of String, String)
            Try
     
                Dim section As Dictionary(Of String, String) = New Dictionary(Of String, String)()
                Sections.Add(name, section)
                Return section
     
            Catch ex As Exception
                logs(ex.Message)
                Throw
            End Try
        End Function
        Public Function GetValue(ByVal section As String, ByVal key As String) As String
            Try
     
                If section = Nothing Then
                    section = ""
                End If
                Dim dSection As Dictionary(Of String, String) = Nothing
                If Sections.TryGetValue(section, dSection) Then
                    Dim value As String = Nothing
                    If dSection.TryGetValue(key, value) Then
                        Return value
                    Else
                        Return Nothing
                    End If
                Else
                    Return Nothing
                End If
     
            Catch ex As Exception
                logs(ex.Message)
                Throw
            End Try
        End Function
        Public Sub SetValue(ByVal section As String, ByVal key As String, ByVal value As String)
            Try
     
                If section = Nothing Then
                    section = ""
                End If
                Dim dSection As Dictionary(Of String, String) = Nothing
                If Not Sections.TryGetValue(section, dSection) Then
                    dSection = AddSection(section)
                End If
                dSection(key) = value
     
            Catch ex As Exception
                logs(ex.Message)
                Throw
            End Try
        End Sub
        Public Sub Save()
            Try
     
                If FileName_ = Nothing Then
                    Throw New InvalidOperationException("The file name is not defined")
                End If
                Using wr As StreamWriter = New StreamWriter(FileName_)
                    Dim noSection As Dictionary(Of String, String) = Nothing
                    If Sections.TryGetValue("", noSection) Then
                        For Each key As String In noSection.Keys
                            wr.WriteLine("{0}={1}", key, Sections("")(key))
                        Next
                        wr.WriteLine()
                    End If
                    For Each secName As String In Sections.Keys
                        If secName.Length = 0 Then
                            Continue For
                        End If
                        wr.WriteLine("[{0}]", secName)
                        For Each key As String In Sections(secName).Keys
                            wr.WriteLine("{0}={1}", key, Sections(secName)(key))
                        Next
                        wr.WriteLine()
                    Next
                End Using
     
            Catch ex As Exception
                logs(ex.Message)
                Throw
            End Try
        End Sub
    End Class

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

Discussions similaires

  1. Comment lire des fichiers iso sous Windows 7 64 bits ?
    Par Battosaiii dans le forum Windows 7
    Réponses: 8
    Dernier message: 25/02/2010, 13h44
  2. Lire un fichier .ini sous Linux
    Par cheprod dans le forum Linux
    Réponses: 2
    Dernier message: 26/04/2006, 17h34
  3. [Apache]Comment cohabiter apache2 et tomcat5 sous Windows?
    Par jlassira dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 13/02/2006, 16h35
  4. Comment detecter une partition linux sous windows?
    Par ibtisss dans le forum Administration système
    Réponses: 5
    Dernier message: 09/02/2006, 11h15
  5. Comment désactiver Ctrl+Alt+Del sous Windows XP
    Par ETOKA dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 04/06/2003, 13h34

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