如何读取和保存ini文件到列表

时间:2017-08-09 09:27:58

标签: c# ini

我在这里搜索过但没有找到解决我的问题的答案,我有一个程序可以读取报告(txt文件)并自动填充工作簿中工作表的特定单元格。我创建了一个用户将在需要时更新的ini文件。 我遇到的问题是我想读取ini文件并将某些部分的内容保存到自己的列表中。这是我的代码:

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();
            }
        }
    }
}

}

以下是我正在使用的代码:

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);
        }
    }

这是一个示例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

我现在可以读取ini文件并将其显示在我的listBox中,我现在要做的是将[Places]部分的名称和值保存到名为PlacesList的列表中,并将Positions的名称和值保存到列表中名为PositionsList。使用当前类,我可以读取所有部分,键和值,但是如何只将我想要的数据放入列表中?

1 个答案:

答案 0 :(得分:1)

您接近上面的代码,但不是循环遍历所有部分,您可以只请求您需要的部分(如果需要,可以应用于相同的条目)。

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;
}

但是,您应该使用密钥来查找值,而不是将数据存储在List中,您应该使用Dictionary查看。

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;
}