如何从ini文件中获取所有节名

时间:2019-05-17 10:14:12

标签: c# ini

我想从ini文件中获取节的列表。我的文件中现在只有一个节,而我的以下代码返回null。

我尝试了使用GetSectionNamesListA和GetPrivateProfileSectionNames的各种方法。他们似乎都没有帮助

   public string[] GetSectionNames(string path)
    {
        byte[] buffer = new byte[1024];
        GetPrivateProfileSectionNames(buffer, buffer.Length, path);
        string allSections = System.Text.Encoding.Default.GetString(buffer);
        string[] sectionNames = allSections.Split('\0');
        return sectionNames;
    }

使用:

[DllImport("kernel32")]
  static extern int GetPrivateProfileSectionNames(byte[] pszReturnBuffer, int nSize, string lpFileName);

尽管存在节,但我仍返回null。

1 个答案:

答案 0 :(得分:0)

最简单的方法可能是使用INI Parser之类的库

以下是使用该库的示例:

var parser = new FileIniDataParser();
IniData data = parser.ReadFile("file.ini");
foreach (var section in data.Sections)
{
   Console.WriteLine(section.SectionName);
}

在您的情况下,GetPrivateProfileSectionNames不提供节名,因为它需要文件的完整路径。如果给它一个相对路径,它将尝试在Windows文件夹中找到它。

  

初始化文件的名称。如果此参数为NULL,则该函数搜索Win.ini文件。如果此参数不包含文件的完整路径,则系统将在Windows目录中搜索文件。

一种解决方法是使用Path.GetFullPath(path)

path = Path.GetFullPath(path);

page显示了GetPrivateProfileSectionNames的正确用法:

[DllImport("kernel32")]
static extern uint GetPrivateProfileSectionNames(IntPtr pszReturnBuffer, uint nSize, string lpFileName);

public static string[] SectionNames(string path)
{
    path = Path.GetFullPath(path);
    uint MAX_BUFFER = 32767;
    IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER);
    uint bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, path);
    if (bytesReturned == 0)
        return null;
    string local = Marshal.PtrToStringAnsi(pReturnedString, (int)bytesReturned).ToString();
    Marshal.FreeCoTaskMem(pReturnedString);
    //use of Substring below removes terminating null for split
    return local.Substring(0, local.Length - 1).Split('\0');
}