首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何合并两个TINIfile实例的条目?

如何合并两个TINIfile实例的条目?
EN

Stack Overflow用户
提问于 2015-12-13 19:43:19
回答 3查看 479关注 0票数 1

有办法将条目从一个TIniFile实例合并到另一个实例吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-13 20:34:48

下面是一个可以将两个INI文件合并到一个新的输出INI文件中的过程:

代码语言:javascript
复制
procedure MergeIniFiles(const FromFilename, ToFilename, OutputFilename: String;
  const Overwrite: Boolean);
var
  IniFrom, IniTo, IniOut: TIniFile;
  Sec: TStringList;
  Val: TStringList;
  X, Y: Integer;
  S, N, V: String;
begin
  IniFrom:= TIniFile.Create(FromFilename);
  IniTo:= TIniFile.Create(ToFilename);
  IniOut:= TIniFile.Create(OutputFilename);
  Sec:= TStringList.Create;
  Val:= TStringList.Create;
  try
    IniFrom.ReadSections(Sec);
    for X := 0 to Sec.Count-1 do begin
      S:= Sec[X];
      IniFrom.ReadSection(S, Val);
      for Y := 0 to Val.Count-1 do begin
        N:= Val[Y];
        V:= IniFrom.ReadString(S, N, '');
        IniOut.WriteString(S, N, V);
      end;
    end;

    IniTo.ReadSections(Sec);
    for X := 0 to Sec.Count-1 do begin
      S:= Sec[X];
      IniTo.ReadSection(S, Val);
      for Y := 0 to Val.Count-1 do begin
        N:= Val[Y];
        V:= IniTo.ReadString(S, N, '');
        if Overwrite then begin
          IniOut.WriteString(S, N, V);
        end else begin
          if not IniOut.ValueExists(S, N) then
            IniOut.WriteString(S, N, V);
        end;
      end;
    end;
  finally
    Val.Free;
    Sec.Free;
    IniOut.Free;
    IniTo.Free;
    IniFrom.Free;
  end;
end;
票数 2
EN

Stack Overflow用户

发布于 2015-12-13 20:22:07

没有一种方法可以做到这一点。你可以这样做:

  1. 加载INI文件,我们称之为A和B。
  2. 枚举B中的部分。
  3. 对于B中的每个节,枚举该节中的名称/值对。
  4. 将B中的每个名称/值对添加到A中相应的部分。
  5. 完成后,保存文件A,其中包含两个文件中的条目。

用于枚举文件A的方法是ReadSectionsReadSectionValues

你需要决定如何处理任何冲突。这是出现在两个文件中的任何名称。

票数 4
EN

Stack Overflow用户

发布于 2016-01-05 14:36:32

我想要实现的是在我的安装程序中有一个ini文件,它将与“program”中的主要可执行文件一起放置。这个ini将包含应用程序的许多属性的默认值。所以用户的实际ini文件(例如。在主文件夹中)将从那里读取“工厂”默认值。这种方法类似于OSX的NSUserDefaults。我认为在某些情况下,这是有用的,而不仅仅是使用inifile.readString()中的默认值。谢谢你们的回答,我只是在此张贴最后的功能.

代码语言:javascript
复制
procedure inifileLoadDefaults(const defaults: TFileName; destination:TIniFile);
var inif: TIniFile;
begin
    inif := TIniFile.Create(defaults);
    try
        inifileLoadDefaults(inif, destination);
    finally
        inif.Free;
    end;
end;


procedure inifileLoadDefaults(const defaults: TIniFile; destination:TIniFile);
var secs, secsVal: TStrings;
    i, k: Integer;
begin
    secs := TStringList.Create;
    secsVal := TStringList.Create;
    try
        defaults.ReadSections(secs);
        for i:=0 to secs.Count -1 do begin
            defaults.ReadSection(secs[i], secsVal);
            for k:=0 to secsVal.Count -1 do
                if not(destination.ValueExists(secs[i], secsVal[k])) then
                    destination.WriteString(secs[i], secsVal[k], defaults.ReadString(secs[i], secsVal[k], ''));
        end;

    finally
        secsVal.Free;
        secs.Free;
    end;
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34255478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档