2015-12-13 65 views
1

有沒有辦法將一個TIniFile實例的條目合併到另一個實例?如何合併來自兩個TINIfile實例的條目?

+0

不是直接,沒有。您必須從一個'TIniFile'中讀取值,並根據需要將它們寫入另一個'TIniFile'。如果您遇到問題,請顯示您的實際代碼。 –

回答

2

這裏是可以一起合併兩個INI文件到一個新的輸出INI文件的程序:

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; 
+0

感謝您的實施,我將不得不改變以使用TINIFile參數。 – Vassilis

+0

@VassilisGr事實上,我只是在猜測意圖是什麼。您需要決定如何適應現有的價值。 –

4

沒有單一的方法來做到這一點。你可以自己做這樣的:

  1. 加載INI文件,我們姑且稱之爲A和B.
  2. 枚舉部分在B.
  3. 對於B中的每個部分,列舉名稱/值對在那一節。
  4. 將B中的每個名稱/值對添加到A的對應部分中。
  5. 完成後,保存包含兩個文件中的條目的文件A.

您將用來枚舉文件A的方法是ReadSectionsReadSectionValues

您需要決定如何處理任何衝突。這是出現在這兩個文件中的任何名稱。

+0

「您需要決定」確實,+ 1 – MartynA

+0

'ReadSectionValues' +1。謝謝 – Vassilis

0

我想達到什麼是在我的安裝程序的ini文件,這將與物品放在一起進行'Program Files'中的主要可執行文件。這個ini將包含應用程序的許多屬性的默認值。因此,用戶的實際ini文件(例如在主文件夾中)將從那裏讀取「工廠」默認值。這種方法類似於OSX的NSUserDefaults。我認爲有些情況下這是有用的,而不是僅使用inifile.readString()中的默認值。謝謝大家的回答,我只是爲此目的發佈最後的功能......

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; 
相關問題