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

Outils Delphi Discussion :

[Inno setup] Modifier un fichier json


Sujet :

Outils Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 91
    Points
    91
    Par défaut [Inno setup] Modifier un fichier json
    Bonjour,

    J'utilise Inno Setup pour générer l'installeur de mon application.
    Mon application lit des fichiers de configuration en JSON.
    Je souhaiterais, via Inno Setup, modifier une entrée dans un des fichiers de config.
    J'ai vu qu'il existait nativement des fonctions pour travailler sur les .ini, mais je ne souhaite pas modifier le format de mes fichiers de conf.

    Voilà à quoi ressemble mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {
        "section1" :
        {
            "key1" : "value1",
            "key2" : "value2"
        }
    }
    Je souhaiterais concrètement, setter value2 avec {userappdata} : "The path to the Application Data folder" (selon la doc Inno).
    Il faut aussi que j'échappe les backslashes du chemin, sinon mon parser n'arrive pas à lire le chemin.

    Première question : est-il possible, via un plugin ou une instruction basique de Inno Setup, de modifier ma variable ? (je ne pense pas).

    Deuxième question : J'ai vu sinon qu'il était possible d'utiliser un script pascal défini dans la section [code] ou dans un fichier externe.
    Quel serait le meilleur moyen pour changer la valeur de la clé ?
    La repérer via expression régulière et la remplacer ?
    La remplacer en recherchant un mot clef qui serait placé à la place de la valeur ? Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {
        "section1" :
        {
            "key1" : "value1",
            "key2" : __KEY_2_VALUE__
        }
    }
    Voila, je suppose qu'il existe des tonnes de solutions à ce problème, mais je préfère ne pas réinventer la roue si un mécanisme permettant ce que je veux faire existe déjà.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 785
    Points : 5 916
    Points
    5 916
    Par défaut
    Bonjour,
    Citation Envoyé par Difré91 Voir le message
    Première question : est-il possible, via un plugin ou une instruction basique de Inno Setup, de modifier ma variable ? (je ne pense pas).
    Non, mais je peux me tromper
    Citation Envoyé par Difré91 Voir le message
    Deuxième question : J'ai vu sinon qu'il était possible d'utiliser un script pascal défini dans la section [code] ou dans un fichier externe.
    Il existe des parseurs JSON open source, mais il faudrait intégrer tout le code de ces unités dans la section [ CODE ] d'Innosetup, ce qui me parait très lourd et pas simple à réaliser vu qu'il faut tout de même adapter du code Delphi en script pascal !
    On pourrait aussi intégrer ce parseur dans une dll et l'appeler depuis le script, mais cela me parait à peine moins lourd...
    Citation Envoyé par Difré91 Voir le message
    Quel serait le meilleur moyen pour changer la valeur de la clé ?
    La repérer via expression régulière et la remplacer ?
    La remplacer en recherchant un mot clef qui serait placé à la place de la valeur ? Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {
        "section1" :
        {
            "key1" : "value1",
            "key2" : __KEY_2_VALUE__
        }
    }
    Si les clés sont repérables sans ambiguité, et compte tenu de la taille plutot faible d'un fichier de configuration, j'utiliserais une TStringList et la fonction StringChange. Exemple partiel de script à inclure :
    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
    [ Files ]
    ; Fichier de configuration à installer
    ; On précise la procédure à appeler après l installation
    Source: "conf.json"; DestDir: "{app}"; AfterInstall: Parametrage
     
    [ Code ]
    // Procédure d’initialisation du fichier de configuration une fois celui-ci installé
    procedure Parametrage;
    var
      SL: TStringList;
      App, Tmp: String;
    begin
      App := ExpandConstant('{app}');
      SL := TStringList.Create;
      try
        SL.LoadFromFile(App + '\Conf.json');
        Tmp := SL.Text;
        StringChange(Tmp, '__KEY_1_VALUE__', '"Valeur 1"');
        StringChange(Tmp, '__KEY_2_VALUE__', '"' + app + '\SousRep');
        SL.Text := Tmp;
        SL.SaveToFile(App + '\Conf.json');
      finally
        SL.Free;
      end;
    end;
    Pour plus de détails, se référer à l'aide d'InnoSetup.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 91
    Points
    91
    Par défaut
    Bonjour,

    Merci beaucoup pour ta réponse, ça marche parfaitement.
    Sinon, j'ai juste une question par curiosité.
    Pourquoi tu utilise une TStringList pour la mettre dans un String, travailler sur le String et le remettre dans la TStringList ?
    J'ai vu cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function LoadStringFromFile(const FileName: String; var S: AnsiString): Boolean;
    Bon, j'avoue que j'ai essayé de l'utiliser et j'ai eu un "Type mismatch".
    Je suppose que AnsiString n'est pas String.
    Du coup, je suis reparti sur ta solution.

    En fait, quel est l'intérêt de TStringList ?

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 785
    Points : 5 916
    Points
    5 916
    Par défaut
    Citation Envoyé par Difré91 Voir le message
    Sinon, j'ai juste une question par curiosité.
    Pourquoi tu utilise une TStringList pour la mettre dans un String, travailler sur le String et le remettre dans la TStringList ?
    Pour éviter que le générateur Innosetup crie lors de la génération du programme d'installation. Il n'aime pas un travail direct...
    Citation Envoyé par Difré91 Voir le message
    J'ai vu cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function LoadStringFromFile(const FileName: String; var S: AnsiString): Boolean;
    Je ne la connaissais pas ! comme quoi...

    Citation Envoyé par Difré91 Voir le message
    Bon, j'avoue que j'ai essayé de l'utiliser et j'ai eu un "Type mismatch".
    Je suppose que AnsiString n'est pas String.
    Si vous utilisez la version unicode d'Innosetup, AMHA, String est un WideString. Dans le cas contraire, string est un AnsiString.
    Citation Envoyé par Difré91 Voir le message
    En fait, quel est l'intérêt de TStringList ?
    D'avoir les fonctions de lecture et sauvegarde de et vers un fichier et pouvoir accéder au contenu via une variable string.
    Mais la fonction citée et son pendant SaveStringToFile doivent permettre de bâtir un script alternatif.

    Complément : Après un petit test de vérification, cela donne :
    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
    procedure Parametrage;
    var
      App, Tmp: String;
    begin
      App := ExpandConstant('{app}');
      if not LoadStringFromfile(App + '\Conf.json', Tmp) then
        MsgBox('Echec Lecture paramétrage.', mbInformation, MB_OK)
      else
      begin
        StringChange(Tmp, '__KEY_1_VALUE__', '"Valeur 1"');
        StringChange(Tmp, '__KEY_2_VALUE__', '"' + app + '\SousRep');
        if not SaveStringToFile(App + '\Conf.json', Tmp, False) then
          MsgBox('Echec modification paramétrage.', mbInformation, MB_OK);
      end;
    end;

Discussions similaires

  1. [Inno Setup] : modifier un fichier ini
    Par Mimie37 dans le forum Outils
    Réponses: 0
    Dernier message: 30/07/2014, 18h05
  2. Réponses: 7
    Dernier message: 01/06/2012, 16h13
  3. [Inno Setup] Modifier la valeur d'une clé de registre
    Par gege2061 dans le forum Outils
    Réponses: 8
    Dernier message: 08/04/2009, 18h42
  4. [Inno Setup] Renommer un fichier durant l'install
    Par freud dans le forum Outils
    Réponses: 2
    Dernier message: 17/09/2008, 21h49
  5. [Inno Setup][VISTA] et fichiers INI
    Par Droïde Système7 dans le forum Outils
    Réponses: 23
    Dernier message: 21/04/2008, 14h47

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