2013-07-21 21 views
3

我需要使用Inno Setup从文本文件编辑特定行。我需要我的安装程序来查找此行("appinstalldir" "C:MYXFOLDER\\apps\\common\\App70")并使用安装程序中的目录路径。Inno Setup - 如何在安装过程中从文本文件中编辑特定行?

这是我想使用的代码:

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" 
    } 
} 
+0

确保无论写入哪个文件都非常严格。如果碰巧把'{'或'}'放在同一行上,那么parsign就会中断。 – Deanna

回答

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; 
+0

您好TLama先生,我编辑这样的代码: 'ReplaceValue(ExpandConstant('{app} \ app70.txt'),'appinstalldir',ExpandConstant('{app}')+'\\ apps \\ common \\ App70' )' 我有一个很好的结果在txt文件: “应用程序” { “的appid”, “70” { “appinstalldir”“C:\ Program Files文件(x86)的\ FOLDER1 \ FOLDER2 \\ apps \\ common \\ App70“ } }' 但是我得到了这个问题......我的软件只读取'”appinstalldir“'目录的路径,如果使用这种格式: '”C:\\ Program Files (x86)\\ FOLDER1 \\ FOLDER2 \\ apps \\ common \\ App70“'我需要添加额外的”\“,我该怎么做? – Dielo

+1

我刚刚编辑过评论,请检查一下 – Dielo

+1

我明白了。您需要将新值的ExpandConstant('{app}')'部分的反斜杠加倍。由于没有直接的功能,所以可以使用'StringChangeEx'函数来替换某个字符串(或者在这个例子中是char)的所有出现。在你的情况下,你可以用单个反斜杠建立你的路径,然后在这个字符串中用双反斜杠替换反斜杠,如编辑后的代码所示。 – TLama

相关问题