2013-07-21 42 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

相關問題