2017-05-24 3 views
2

Comment puis-je ajouter une ligne à un fichier/modèle avant une autre ligne spécifique, si elle n'existe pas?Inno Setup - Insérer une ligne dans un fichier texte/modèle avant une ligne spécifique si elle n'existe pas encore

Par exemple, pour le fichier JS suivant, je dois vous assurer qu'il ya dependencies.push(...) ligne entre les ABOVE THIS LINE et BELOW THIS LINE commentaire des lignes. Si le dependencies.push(...) n'est pas présent, je dois l'ajouter avant la BELOW THIS LINE commentaire en ligne:

(function(ng) { 
    var dependencies = []; 

    /*DO NOT MODIFY ABOVE THIS LINE!*/ 

    dependencies.push("mxdfNewTransaction.controller.mxdfNewTransactionCtrl"); 

    /*DO NOT MODIFY BELOW THIS LINE!*/ 

    ng.module('prismApp.customizations', dependencies, null); 
})(angular); 

Je dois aussi faire la même chose avec un fichier modèle HTML similaire.

Merci pour votre aide.

+0

"spécifié autre ligne" - Comment spécifié? Montre-nous un exemple. –

+0

@MartinPrikryl J'ai édité ma question. Il peut être préférable de comprendre. –

+0

Je ne comprends toujours pas ce que vous voulez. Modifiez-vous un fichier 'customizations.js' existant? Ou le fichier est-il complètement créé par l'installateur? Si le premier, à quoi ressemble le fichier avant l'installation et à quoi devrait-il ressembler après? –

Répondre

1

Vous devez analyser le fichier ligne par ligne pour trouver l'endroit où insérer votre code.

Quelque chose comme ceci:

function AddLineToTemplate(
    FileName: string; StartLine, EndLine, AddLine: string): Boolean; 
var 
    Lines: TArrayOfString; 
    Count, I, I2: Integer; 
    Line: string; 
    State: Integer; 
begin 
    Result := True; 

    if not LoadStringsFromFile(FileName, Lines) then 
    begin 
    Log(Format('Error reading %s', [FileName])); 
    Result := False; 
    end 
    else 
    begin 
    State := 0; 

    Count := GetArrayLength(Lines); 
    for I := 0 to Count - 1 do 
    begin 
     Line := Trim(Lines[I]); 
     if (CompareText(Line, StartLine) = 0) then 
     begin 
     State := 1; 
     Log(Format('Start line found at %d', [I])); 
     end 
     else 
     if (State = 1) and (CompareText(Line, AddLine) = 0) then 
     begin 
     Log(Format('Line already present at %d', [I])); 
     State := 2; 
     break; 
     end 
     else 
     if (State = 1) and (CompareText(Line, EndLine) = 0) then 
     begin 
     Log(Format('End line found at %d, inserting', [I])); 
     SetArrayLength(Lines, Count + 1); 
     for I2 := Count - 1 downto I do 
      Lines[I2 + 1] := Lines[I2]; 
     Lines[I] := AddLine; 
     State := 2; 

     if not SaveStringsToFile(FileName, Lines, False) then 
     begin 
      Log(Format('Error writting %s', [FileName])); 
      Result := False; 
     end 
      else 
     begin 
      Log(Format('Modifications saved to %s', [FileName])); 
     end; 

     break; 
     end; 
    end; 

    if Result and (State <> 2) then 
    begin 
     Log(Format('Spot to insert line was not found in %s', [FileName])); 
     Result := False; 
    end; 
    end; 
end; 

Vous pouvez l'utiliser comme ceci:

if AddLineToTemplate(
    'C:\path\to\customizations.js', 
    '/*DO NOT MODIFY ABOVE THIS LINE!*/', 
    '/*DO NOT MODIFY BELOW THIS LINE!*/', 
    ' dependencies.push("mxdfNewTransaction.controller.mxdfNewTransactionCtrl");') then 
begin 
    Log('Success'); 
end 
    else 
begin 
    Log('Failure'); 
end; 

Méfiez-vous des limites LoadStringsFromFile et SaveStringsToFile, lorsque vous travaillez avec des fichiers Unicode. Voir Inno Setup Reading file in Ansi and Unicode encoding.