Classe de gestion de fichiers ini

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 183 fois - Téléchargée 16 fois

Contenu du snippet

Oui, j'ai pu constater sur le net que pas mal de monde se sert encore et toujours des fichiers INI, qui, je suis d'accord, reste un support très simple et efficace pour conserver des données notamment de paramétrage...
On peut trouver quelques sources permettant de lire dans des fichiers INI, mais peu permettent de les gérer entièrement ; voici une classe que j'ai faîte, en partant d'un bout de code trouvé sur le net, que j'ai bien étoffé :

Source / Exemple :


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

namespace MonEspaceDeNom
{
	/// <summary>
	/// Classe permettant de gérer les fichiers INI.
	/// </summary>
	public class Ini
	{
		// API Windows
		[DllImport("kernel32")]
		private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
    
		[DllImport("kernel32")]
		private static extern int GetPrivateProfileSection(string section, IntPtr lpReturnedString, int nSize, string lpFileName);

		[DllImport("kernel32")]
		private static extern int GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer, int nSize, string lpFileName);

		[DllImport("kernel32")]
		private static extern int WritePrivateProfileSection(string section, string lpString, string lpFileName);

		[DllImport("kernel32")]
		private static extern int WritePrivateProfileString(string section, string key, string lpString, string lpFileName);

		private string m_pfileName;

		/// <summary>
		/// Obtient ou définit le chemin d'accès complet au fichier INI.
		/// </summary>
		public string Filename
		{
			get { return m_pfileName; }
			set { m_pfileName = value; }
		}
        
		/// <summary>
		/// Initialize une instance de <see cref="Ini"/>.
		/// </summary>
		/// <param name="lpFileName">Chemin d'accès complet au fichier INI.</param>
		public Ini(string lpFileName)
		{
			this.m_pfileName = lpFileName;
		}

		/// <summary>
		/// Supprime une section ainsi que toutes les valeurs qu'elle contient.
		/// </summary>
		/// <param name="section">Nom de la section.</param>
		public int RemoveSection(string section)
		{
			return WritePrivateProfileSection(section, null, m_pfileName);
		}

		/// <summary>
		/// Supprime une valeur.
		/// </summary>
		/// <param name="section">Nom de la section.</param>
		/// <param name="key">Nom de la valeur.</param>
		public int RemoveString(string section, string key)
		{
			return WritePrivateProfileString(section, key, null, m_pfileName);
		}

		/// <summary>
		/// Ecrit une valeur dans une section.
		/// </summary>
		/// <param name="section">Nom de la section.</param>
		/// <param name="key">Nom de la valeur.</param>
		/// <param name="lpString">Valeur.</param>
		public int WriteString(string section, string key, string lpString)
		{
			return WritePrivateProfileString(section, key, lpString, m_pfileName);
		}

		/// <summary>
		/// Obtient la valeur d'une section.
		/// </summary>
		/// <param name="section">Nom de la section.</param>
		/// <param name="key">Nom de la valeur.</param>
		public string ReadString(string section, string key)
		{
			const int bufferSize = 255;
			StringBuilder temp = new StringBuilder(bufferSize);
			GetPrivateProfileString(section, key, "", temp, bufferSize, m_pfileName);
			return temp.ToString();
		}

		/// <summary>
		/// Obtient l'ensemble des valeurs d'une section.
		/// </summary>
		/// <param name="section">Nom de la section.</param>
		public string[] ReadSection(string section)
		{
			const int bufferSize = 2048;

			StringBuilder returnedString = new StringBuilder();

			IntPtr pReturnedString = Marshal.AllocCoTaskMem(bufferSize);
			try
			{
				int bytesReturned = GetPrivateProfileSection(section, pReturnedString, bufferSize, m_pfileName);

				// bytesReturned -1 pour retirer le dernier \0
				for( int i = 0; i < bytesReturned-1; i++ )
					returnedString.Append((char)Marshal.ReadByte(new IntPtr((uint)pReturnedString + (uint)i)));
			}
			finally
			{
				Marshal.FreeCoTaskMem(pReturnedString);
			}

			string sectionData = returnedString.ToString();
			return sectionData.Split('\0');
		}

		/// <summary>
		/// Obtient le nom de toutes les sections.
		/// </summary>
		public string[] ReadSections()
		{
			const int bufferSize = 2048;

			StringBuilder returnedString = new StringBuilder();

			IntPtr pReturnedString = Marshal.AllocCoTaskMem(bufferSize);
			try
			{
				int bytesReturned = GetPrivateProfileSectionNames(pReturnedString, bufferSize, m_pfileName);

				// bytesReturned -1 pour retirer le dernier \0
				for( int i = 0; i < bytesReturned-1; i++ )
					returnedString.Append((char)Marshal.ReadByte(new IntPtr((uint)pReturnedString + (uint)i)));
			}
			finally
			{
				Marshal.FreeCoTaskMem(pReturnedString);
			}

			string sectionData = returnedString.ToString();
			return sectionData.Split('\0');
		}
	}
}

A voir également

Ajouter un commentaire

Commentaires

chakourcsharp
Messages postés
4
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
6 avril 2015

merci
petertoy1
Messages postés
2
Date d'inscription
mardi 12 juin 2007
Statut
Membre
Dernière intervention
27 décembre 2009

Super et génial!
Ton code permet de passer du C++ au c# très simplement
Pour un débutant en C#, cela m'a donné beaucoup d'idèes!
Merci beaucoup.
cs_giovaFR
Messages postés
1
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
1 décembre 2008

Génial, c'est exactement ce que je cherchais ! pouvoir lister les sections/clées, et les éditer.

Merci !

PS : et oui des fois on a pas le choix, on doit travailler avec les .INI pour s'interfacer avec de vieux systemes. Merci encore !
philoutte
Messages postés
1
Date d'inscription
jeudi 25 mai 2006
Statut
Membre
Dernière intervention
7 juillet 2008

Elle est vraiment bien (et m'a été fort utile ^^ )

Merci :)
winny68
Messages postés
99
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
14 février 2011
1
Elle est très bien. Mais peut-être une peu grosse pour les petites applications.

Cependant, c'est une super idée de la parager.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.