问题描述
我发现了如何创建向导页面来收集所需信息。但是我的应用程序有一个config.js
文件,我需要在其中根据用户输入更改一些值。写入该文件的最佳方法是什么?用SaveStringToFile
写入整个文件还是以某种方式导入文件并替换某些字符串部分?
这是当前配置的摘录:
let cfg = {
hapi: {
port: 3000,host: '0.0.0.0',maxUploadBytes: 1000000 * 50 // 50 MB
},jwt: {
key: 'secretkey',algorithm: 'HS256',expiresIn: '1h'
},authentication: {
encryption: {
saltRounds: 10 // will be used in bcrypt to encrypt passwords
}
},db_config: {
user: 'username',password: 'pw',server: 'DESKTOP-IG',database: 'TestDB-1'
},scripts: {
ConnectorInstallPath: "C:\\Program\ Files\\ Connector\\"
}
}
我必须更改以下各项的值:user: 'username'
,password: 'pw'
,server: 'DESKTOP-IG'
,database: 'TestDB-1'
,port: 3000
和ConnectorInstallPath: "C:\\Program\ Files\\ Connector\\"
。
使用server: '*'
之类的模式进行替换就足够了。不必更聪明。
非常感谢。
解决方法
以下功能可以更改配置文件中的属性:
function SetConfigProperty(FileName,Name: string; Value: string): Boolean;
var
Lines: TArrayOfString;
Count,I,P: Integer;
HasComma: Boolean;
Line: string;
State: Integer;
begin
Result := True;
if not LoadStringsFromFile(FileName,Lines) then
begin
Log(Format('Error reading %s',[FileName]));
Result := False;
end
else
begin
State := 0;
Count := GetArrayLength(Lines);
for I := 0 to Count - 1 do
begin
Line := Lines[I];
P := Pos(':',Line);
if (CompareText(Trim(Copy(Line,1,P - 1)),Name) = 0) then
begin
Log(Format('Found property %s at line %d',[Name,(I + 1)]));
HasComma := (Copy(Trim(Line),Length(Trim(Line)),1) = ',');
Line := Copy(Line,P) + ' ' + Value;
if HasComma then Line := Line + ',';
Lines[I] := Line;
Result := SaveStringsToFile(FileName,Lines,False);
if not Result then
begin
Log(Format('Error writing %s',[FileName]));
end
else
begin
Log(Format('Modifications saved to %s',[FileName]));
end;
break;
end;
if I = Count - 1 then
begin
Log(Format('Property %s not found',[Name]));
Result := False;
end;
end;
end;
end;
Value
必须在冒号后包含完整的内容。使用字符串属性,甚至必须包含引号。例如:
SetConfigProperty(FileName,'server','''DESKTOP-IG''');
您可以在CurStepChanged
步骤的ssPostInstall
事件函数中使用该函数(已安装文件时):
procedure CurStepChanged(CurStep: TSetupStep);
var
FileName: string;
ErrorCode: Integer;
begin
if CurStep = ssPostInstall then
begin
FileName := ExpandConstant('{app}\config.js');
SetConfigProperty(FileName,'username','''' + UsernameEdit.Text + '''');
SetConfigProperty(FileName,'Password','''' + PasswordEdit.Text + '''');
SetConfigProperty(FileName,'''' + ServerEdit.Text + '''');
SetConfigProperty(FileName,'port',PortEdit.Text);
{ ... }
end;
end;