C# - Trabalhando com INI Files


Os arquivos INI são freqüentemente usados ​​por software legado. Mas às vezes também por software não tão legado. Então às vezes é necessário acessar arquivos INI do .NET / C #, mas não existe nenhuma classe ou método em .NET / C # que possa ler ou escrever arquivos INI. Mas existem algumas funções no kernel32.dll que podem ser usadas pela Platform Invoke (PInvoke). Essas funções (GetPrivateProfileString, GetPrivateProfileSection e WritePrivateProfileString) são fornecidas para compatibilidade, no entanto, elas podem ser usadas.

Segue a implementação de uma classe "IniFile":

using System;
using System.Runtime.InteropServices;
using System.Text;

public class IniFile
{
	private readonly string filePath;
	private int capacity = 512;

	[DllImport("kernel32", CharSet = CharSet.Unicode)]
	private static extern int GetPrivateProfileString(string section, string key, string defaultValue, StringBuilder value, int size, string filePath);

	[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
	static extern int GetPrivateProfileString(string section, string key, string defaultValue, [In, Out] char[] value, int size, string filePath);

	[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
	private static extern int GetPrivateProfileSection(string section, IntPtr keyValue, int size, string filePath);

	[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
	[return: MarshalAs(UnmanagedType.Bool)]
	private static extern bool WritePrivateProfileString(string section, string key, string value, string filePath);

	public IniFile(string Path)
	{
		filePath = Path;
	}

	public string ReadValue(string section, string key, string defaultValue = "")
	{
		var value = new StringBuilder(capacity);
		GetPrivateProfileString(section, key, defaultValue, value, value.Capacity, filePath);
		return value.ToString();
	}

	public string[] ReadSections()
	{
		// first line will not recognize if ini file is saved in UTF-8 with BOM 
		while (true)
		{
			char[] chars = new char[capacity];
			int size = GetPrivateProfileString(null, null, "", chars, capacity, filePath);

			if (size == 0)
			{
				return null;
			}

			if (size < capacity - 2)
			{
				string result = new String(chars, 0, size);
				string[] sections = result.Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
				return sections;
			}

			capacity = capacity * 2;
		}
	}

	public string[] ReadKeys(string section)
	{
		// first line will not recognize if ini file is saved in UTF-8 with BOM 
		while (true)
		{
			char[] chars = new char[capacity];
			int size = GetPrivateProfileString(section, null, "", chars, capacity, filePath);

			if (size == 0)
			{
				return null;
			}

			if (size < capacity - 2)
			{
				string result = new String(chars, 0, size);
				string[] keys = result.Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
				return keys;
			}

			capacity = capacity * 2;
		}
	}

	public string[] ReadKeyValuePairs(string section)
	{
		while (true)
		{
			IntPtr returnedString = Marshal.AllocCoTaskMem(capacity * sizeof(char));
			int size = GetPrivateProfileSection(section, returnedString, capacity, filePath);

			if (size == 0)
			{
				Marshal.FreeCoTaskMem(returnedString);
				return null;
			}

			if (size < capacity - 2)
			{
				string result = Marshal.PtrToStringAuto(returnedString, size - 1);
				Marshal.FreeCoTaskMem(returnedString);
				string[] keyValuePairs = result.Split('\0');
				return keyValuePairs;
			}

			Marshal.FreeCoTaskMem(returnedString);
			capacity = capacity * 2;
		}
	}

	public bool WriteValue(string section, string key, string value)
	{
		bool result = WritePrivateProfileString(section, key, value, filePath);
		return result;
	}

	public bool DeleteSection(string section)
	{
		bool result = WritePrivateProfileString(section, null, null, filePath);
		return result;
	}

	public bool DeleteKey(string section, string key)
	{
		bool result = WritePrivateProfileString(section, key, null, filePath);
		return result;
	}
}

Basta adicionar no projeto e usar... 

Há outras opções também, como utilizar uma biblioteca externa INI Parser.

c · ‎inifile · ‎ini · ‎iniparser

Última atualização: 16/03/2018 às 10:13


  • Buscar