Самый простой способ - использовать такую библиотеку, как 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);
А на этой странице показано правильное использование 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');
}