Inno setup 用Inno设置替换文件中的文本

Inno setup 用Inno设置替换文件中的文本,inno-setup,pascalscript,Inno Setup,Pascalscript,您好,我在用Inno设置(基于Delphi)替换文本文件中的文本时遇到问题 我的代码: procedure FileReplaceString(常量文件名、搜索字符串、replacestring:string); 变量 fs:TFileStream; S:字符串; 开始 fs:=TFileStream.Create(文件名、fmOpenread或fmsharedynone); 尝试 设置长度(S,fs.大小); fs.ReadBuffer(S[1],fs.Size); 最后 财政司司长:免费;

您好,我在用Inno设置(基于Delphi)替换文本文件中的文本时遇到问题

我的代码:

procedure FileReplaceString(常量文件名、搜索字符串、replacestring:string);
变量
fs:TFileStream;
S:字符串;
开始
fs:=TFileStream.Create(文件名、fmOpenread或fmsharedynone);
尝试
设置长度(S,fs.大小);
fs.ReadBuffer(S[1],fs.Size);
最后
财政司司长:免费;
结束;
{编译器在此停止:未知标识符'StringReplace'}
S:=StringReplace(S,SearchString,replaceString,[rfReplaceAll,rfIgnoreCase]);
fs:=TFileStream.Create(文件名,fmCreate);
尝试
fs.WriteBuffer(S[1],长度(S));
最后
财政司司长:免费;
结束;
结束;
我发现我必须使用
StringChange()
,但我不知道如何在代码中使用它。我对Delphi或Inno安装不太了解。
我希望您能帮助我。

我希望此功能可以完成以下任务:

函数FileReplaceString(const FileName,SearchString,ReplaceString:string):布尔值;
变量
MyFile:TStrings;
MyText:string;
开始
MyFile:=TStringList.Create;
尝试
结果:=真;
尝试
LoadFromFile(文件名);
MyText:=MyFile.Text;
{仅当文本已更改时保存。}
如果StringChangeEx(MyText、SearchString、ReplaceString、True)>0,则
开始;
MyFile.Text:=MyText;
MyFile.SaveToFile(文件名);
结束;
除了
结果:=假;
结束;
最后
免费的;
结束;
结束;

感谢TLama的反馈。

Inno设置!=德尔福
。Inno安装程序是用Delphi编译的,但它使用自己的语言,基于Pascal Script.Thx作为答案。那么我现在应该如何更改代码。该输入文件是否包含Unicode文本?StringChange(s、SearchString、replaceString、True)您可以使用
如果StringChangeEx(…)>0,则将文本分配给字符串列表并保存
。而且
OK
是不必要的。只需将
False
指定给
结果
作为第一行,并仅在没有任何异常的情况下才将
True
指定。@TLama,谢谢您的建议。我修改了检查文件内容更改的代码。关于返回的结果;如果文件不存在(没有引发异常),它也会返回false,因此我保持不变。(我使用OK而不是result的目的是为了可读性。)IMHO,在调用该函数之前,检查文件是否存在应该在该函数之外完成(想象一下,您将调用10个处理同一文件的函数,并在每个函数中询问该文件是否存在)。我知道,这是品味的问题,但是如果文件由于某种原因(主要是访问权限)打开失败,您将引发一个异常,那么为什么不引发一个表达式,即使文件因为不存在而无法打开呢?关于这个
好的
,好吧,我被一个“正确”编写的代码束缚住了,以至于我发现这个构造令人困惑。但同样,这是一个品味的问题:-)