2013-11-24 51 views
5

嗨我有一個用Inno Setup(基於Delphi)替換文本文件中的文本的問題。用Inno Setup替換文件中的文本

我的代碼:

procedure FileReplaceString(const FileName, searchstring, replacestring: string); 
var 
    fs: TFileStream; 
    S: string; 
begin 
    fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone); 
    try 
     SetLength(S, fs.Size); 
     fs.ReadBuffer(S[1], fs.Size); 
    finally 
     fs.Free; 
    end; 
    { the compiler stops here with: unknown identifier 'StringReplace' } 
    S := StringReplace(S, SearchString, replaceString, [rfReplaceAll, rfIgnoreCase]); 
    fs := TFileStream.Create(FileName, fmCreate); 
    try 
     fs.WriteBuffer(S[1], Length(S)); 
    finally 
     fs.Free; 
    end; 
end; 

我發現我不得不使用StringChange(),而不是,但我不知道怎麼跟我的代碼中使用它。我不太瞭解Delphi或Inno Setup。 我希望你能幫助我。

+2

'Inno Setup!= Delphi'。 Inno Setup在Delphi中編譯,但它使用基於Pascal腳本的語言。 – TLama

+0

Thx爲您的答案。那麼現在應該如何更改我的代碼。 – user3025417

+0

該輸入文件是否包含Unicode文本? – TLama

回答

9

我希望這個函數的工作:

function FileReplaceString(const FileName, SearchString, ReplaceString: string):boolean; 
var 
    MyFile : TStrings; 
    MyText : string; 
begin 
    MyFile := TStringList.Create; 

    try 
    result := true; 

    try 
     MyFile.LoadFromFile(FileName); 
     MyText := MyFile.Text; 

     { Only save if text has been changed. } 
     if StringChangeEx(MyText, SearchString, ReplaceString, True) > 0 then 
     begin; 
     MyFile.Text := MyText; 
     MyFile.SaveToFile(FileName); 
     end; 
    except 
     result := false; 
    end; 
    finally 
    MyFile.Free; 
    end; 
end; 

榮譽給TLama反饋。

+1

您可以使用'if StringChangeEx(...)> 0然後將文本指定給字符串列表並保存'。而那個'好'沒有必要。只要將'False'作爲第一行分配給'Result',並且只在不存在任何異常的情況下分配'True'。 – TLama

+0

@TLama,謝謝你的建議。我修改了檢查文件內容更改的代碼。關於返回的結果;如果文件不存在,它也會返回false(不會引發異常),所以我保持不變。 (我的意圖是使用OK而不是結果是爲了可讀性。) – Lars

+1

恕我直言,檢查文件是否存在應該在此函數之外完成,然後再調用它(想象一下,例如,你會調用10個函數處理相同的文件,在每一個你會問如果同一個文件存在)。我知道,這是品味的問題,但是如果由於某種原因文件打開失敗(主要是訪問權限),您將引發異常,那麼即使文件無法打開,爲什麼不提示一個表示,因爲它沒有存在嗎?關於那個'好',好吧,我被綁在一個「正確」的書面代碼上,以致於我發現構造混亂。但是,再次,這是一個品味的問題:-) – TLama