Inno Setup修改文本文件并更改特定行

时间:2016-03-11 09:31:00

标签: inno-setup

我需要打开一个INI文件并读取一个特定值并检查它是否有不同的更改。

但是案例是我的INI文件没有任何部分或键值

例如,该文件仅包含2行以下。我需要的是阅读第二行(应该是16001)。如果不匹配则更改那个。

Nexusdb@localhost
16000

请提出任何想法,这对我很有帮助!

提前谢谢。

1 个答案:

答案 0 :(得分:3)

您的文件不是INI文件。它不仅没有部分,甚至没有键。

您必须将文件编辑为纯文本文件。您不能使用INI文件功能。

此代码将执行:

function GetLastError(): LongInt; external 'GetLastError@kernel32.dll stdcall';

function SetLineInFile(FileName: string; Index: Integer; Line: string): Boolean;
var
  Lines: TArrayOfString;
  Count: Integer;
begin
  if not LoadStringsFromFile(FileName, Lines) then
  begin
    Log(Format('Error reading file "%s". %s', [FileName, SysErrorMessage(GetLastError)]));
    Result := False;
  end
    else
  begin
    Count := GetArrayLength(Lines);
    if Index >= GetArrayLength(Lines) then
    begin
      Log(Format('There''s no line %d in file "%s". There are %d lines only.', [
            Index, FileName, Count]));
      Result := False;
    end
      else
    if Lines[Index] = Line then
    begin                     
      Log(Format('Line %d in file "%s" is already "%s". Not changing.', [
            Index, FileName, Line]));
      Result := True;
    end
      else
    begin
      Log(Format('Updating line %d in file "%s" from "%s" to "%s".', [
            Index, FileName, Lines[Index], Line]));
      Lines[Index] := Line;
      if not SaveStringsToFile(FileName, Lines, False) then
      begin
        Log(Format('Error writting file "%s". %s', [
              FileName, SysErrorMessage(GetLastError)]));
        Result := False;
      end
        else
      begin
        Log(Format('File "%s" saved.', [FileName]));
        Result := True;
      end;
    end;
  end;
end;

使用它像:

SetLineInFile(ExpandConstant('{app}\Myini.ini'), 1, '16001');

(索引从零开始)