Inno设置 - 如何在设置过程中编辑文本文件中的特定行?

时间:2013-07-21 02:56:02

标签: inno-setup

我需要使用Inno Setup从文本文件中编辑特定行。我需要安装程序找到这一行("appinstalldir" "C:MYXFOLDER\\apps\\common\\App70")并使用安装程序中的目录路径。

这是我尝试使用的代码:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then
  begin
    SaveStringToFile(
      ExpandConstant('{app}\app70.txt'),
      'directory's path' + '\\apps\\common\\App70', True);
  end;
end;

这是我的文字档案:

"App"
{
    "appID"     "70"

    {
        "appinstalldir"     "C:MYXFOLDER\\apps\\common\\App70"
    }
}

1 个答案:

答案 0 :(得分:8)

这段代码可以做到。但是请注意,如果标记的值被引用字符括起来,则此代码不会检查,一旦找到由TagName参数指定的标记,它就会切断该行的其余部分并附加给定的值按TagValue参数:

function ReplaceValue(const FileName, TagName, TagValue: string): Boolean;
var
  I: Integer;
  Tag: string;
  Line: string;
  TagPos: Integer;
  FileLines: TStringList;
begin
  Result := False;
  FileLines := TStringList.Create;
  try
    Tag := '"' + TagName + '"';
    FileLines.LoadFromFile(FileName);
    for I := 0 to FileLines.Count - 1 do
    begin
      Line := FileLines[I];
      TagPos := Pos(Tag, Line);
      if TagPos > 0 then
      begin
        Result := True;
        Delete(Line, TagPos + Length(Tag), MaxInt);
        Line := Line + ' "' + TagValue + '"';
        FileLines[I] := Line;
        FileLines.SaveToFile(FileName);
        Break;
      end;
    end;
  finally
    FileLines.Free;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  NewPath: string;
begin
  if CurStep = ssDone then
  begin
    NewPath := ExpandConstant('{app}') + '\apps\common\App70';
    StringChangeEx(NewPath, '\', '\\', True);

    if ReplaceValue(ExpandConstant('{app}\app70.txt'), 'appinstalldir', 
      NewPath) 
    then
      MsgBox('Tag value has been replaced!', mbInformation, MB_OK)
    else  
      MsgBox('Tag value has not been replaced!.', mbError, MB_OK);
  end;
end;