Classe de gestion de fichiers ini

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 055 fois - Téléchargée 18 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
11 mai 2013 à 01:12
merci
petertoy1 Messages postés 2 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 27 décembre 2009
1 déc. 2009 à 22:05
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
1 déc. 2008 à 16:10
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
7 juil. 2008 à 09:04
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
10 juin 2008 à 17:43
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.
Afficher les 6 commentaires

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.