2013-11-24 52 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