2017-08-09 1 views
1

Ich habe hier gesucht und keine Antwort gefunden, die mein Problem anspricht. Ich habe ein Programm, das einen Bericht liest (txt-Datei) und automatisch bestimmte Zellen eines Arbeitsblatts in eine Arbeitsmappe füllt . Ich habe eine Ini-Datei erstellt, die der Benutzer bei Bedarf aktualisiert. Das Problem, das ich habe, ist, ich möchte die Ini-Datei lesen und den Inhalt bestimmter Abschnitte in ihre eigenen Listen speichern. Hier ist mein Code:So lesen und speichern Sie eine Ini-Datei in eine Liste

public class IniFile 
{ 

    [DllImport("kernel32")] 
    static extern int GetPrivateProfileString(string Section, string Key, 
      string Value, StringBuilder Result, int Size, string FileName); 


    [DllImport("kernel32")] 
    static extern int GetPrivateProfileString(string Section, int Key, 
      string Value, [MarshalAs(UnmanagedType.LPArray)] byte[] Result, 
      int Size, string FileName); 


    [DllImport("kernel32")] 
    static extern int GetPrivateProfileString(int Section, string Key, 
      string Value, [MarshalAs(UnmanagedType.LPArray)] byte[] Result, 
      int Size, string FileName); 

    public string path; 
    public IniFile(string INIPath) 
    { 
     path = INIPath; 
    } 

    public string[] GetSectionNames() 
    { 
     for (int maxsize = 500; true; maxsize *= 2) 
     { 
      byte[] bytes = new byte[maxsize]; 
      int size = GetPrivateProfileString(0, "", "", bytes, maxsize, path); 

      if (size < maxsize - 2) 
      { 
       string Selected = Encoding.ASCII.GetString(bytes, 0, 
           size - (size > 0 ? 1 : 0)); 
       return Selected.Split(new char[] { '\0' }); 
      } 
     } 
    } 

    public string[] GetEntryKeyNames(string section) 
    { 
     for (int maxsize = 500; true; maxsize *= 2) 
     { 
      byte[] bytes = new byte[maxsize]; 
      int  size  = GetPrivateProfileString(section, 0, "", bytes, maxsize, path); 

      if (size < maxsize - 2) 
      { 
       string entries = Encoding.ASCII.GetString(bytes, 0, 
           size - (size > 0 ? 1 : 0)); 
       return entries.Split(new char[] { '\0' }); 
      } 
     } 
    } 

    public object GetEntryKeyValue(string section, string entry) 
    { 
     for (int maxsize = 250; true; maxsize *= 2) 
     { 
      StringBuilder result = new StringBuilder(maxsize); 
      int   size  = GetPrivateProfileString(section, entry, "", 
           result, maxsize, path); 
      if (size < maxsize - 1) 
      { 
       return result.ToString(); 
      } 
     } 
    } 
} 

}

Hier ist mein Code im Einsatz:

List<string> PlacesList= new List<string>(); 
    List<string> PositionsList= new List<string>(); 

    private void btnReadini_Click(object sender, EventArgs e) 
    { 
     IniFile INI = new IniFile(@"C:\Races.ini"); 
     try 
     { 
      string[] SectionHeader = INI.GetSectionNames(); 
      if (SectionHeader != null) 
      { 
       foreach (string SecHead in SectionHeader) 
       { 
        listBox1.Items.Add(""); 
        listBox1.Items.Add("[" +SecHead+"]"); 

        string[] Entry = INI.GetEntryKeyNames(SecHead); 
        if (Entry != null) 
        { 
         foreach (string EntName in Entry) 
         { 
          listBox1.Items.Add(EntName +"=" + 
             INI.GetEntryKeyValue(SecHead, EntName)); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      listBox1.Items.Add("Error: " + ex); 
     } 
    } 

Hier ist ein Beispiel ini

[Places] 
IOM=Isle of man 
UK=United Kingdom 
IRE=Ireland 
[Races] 
IOM=7 
UK=6 
[Positions] 
WN=Win 
2nd=Second 
3rd=Third 
4th=Fourth 

Datei kann ich zur Zeit lesen die ini Datei und zeige es in meiner listBox an, was ich jetzt tun möchte, ist, den Namen und den Wert von Abschnitt [Orte] in einer Liste namens Ort zu speichern sListen Sie und speichern Sie den Namen und den Wert von Positionen in einer Liste namens PositionsList. Mit der aktuellen Klasse kann ich alle Abschnitte, Schlüssel und Werte lesen, aber wie bekomme ich nur die gewünschten Daten in die Listen?

Antwort

1

Sie waren in der Nähe des obigen Codes, aber anstatt durch alle Abschnitte zu gehen, können Sie nur die benötigten anfordern (das Gleiche könnte bei Bedarf auf die Einträge angewendet werden).

List<string> PlacesList= new List<string>(); 
List<string> PositionsList= new List<string>(); 

public void btnReadini_Click(object sender, EventArgs e) 
{ 
    PlacesList = ListEntries("Places"); 
    PositionsList = ListEntries("Positions"); 
} 

public List<string> ListEntries(string sectionName) 
{ 
    IniFile INI = new IniFile(@"C:\Races.ini"); 
    List<string> entries = null; 

    string[] Entry = INI.GetEntryKeyNames(sectionName); 
    if (Entry != null) 
    { 
     entries = new List<string>(); 

     foreach (string EntName in Entry) 
     { 
      entries.Add(EntName + "=" + INI.GetEntryKeyValue(sectionName, EntName)); 
     } 
    } 

    return entries; 
} 

Anstatt jedoch die Daten in einer Liste speichern Sie bei Verwendung eines Dictionary aussehen sollte, dann können Sie die Taste verwenden, um den Wert Nachschlag.

public Dictionary<string, string> ListEntries(string sectionName) 
{ 
    IniFile INI = new IniFile(@"C:\Races.ini"); 

    string[] Entry = INI.GetEntryKeyNames(sectionName); 
    var entries = Entry .Where(x => !string.IsNullOrEmpty(x)) 
         .ToDictionary(m => m, 
             m => INI.GetEntryKeyValue(sectionName, m)); 

    return entries; 
} 
+0

Super, danke Jon Clarke – Oxlade

+0

Großartig! Bitte können Sie dies als die Antwort markieren, damit andere es in Zukunft leicht finden können ... –

+0

Sorry Jon Clarke, ich dachte, ich hätte. Es ist jetzt markiert. Vielen Dank – Oxlade

Verwandte Themen