Lire et écrire des fichiers INI en C#

Muhammad Zeeshan 12 octobre 2023
  1. Qu’est-ce que le fichier INI en C#
  2. Utilisez WritePrivateProfileString pour enregistrer les paramètres nouveaux et modifiés dans un fichier INI en C#
  3. Utilisez ReadPrivateProfileString pour lire les données d’un fichier INI en C#
  4. Lire et écrire des fichiers INI en C#
Lire et écrire des fichiers INI en C#

Ce tutoriel apprend à lire et écrire des fichiers INI en C#.

Qu’est-ce que le fichier INI en C#

Les fichiers d’initialisation, souvent appelés fichiers INI, sont des fichiers texte permettant de stocker les informations de configuration du programme. Le framework .NET ne supporte pas nativement les fichiers INI.

Vous pouvez utiliser les méthodes de l’API Windows à l’aide de Platform Invocation Services pour écrire et lire dans les fichiers. Ce tutoriel va construire une classe représentant les fichiers INI et les manipuler avec les opérations de l’API Windows.

Pour fonctionner avec les fichiers INI, nous aurons besoin de deux fonctions de l’API Windows, WritePrivateProfileString et ReadPrivateProfileString.

Utilisez WritePrivateProfileString pour enregistrer les paramètres nouveaux et modifiés dans un fichier INI en C#

Dans un fichier INI, WritePrivateProfileString enregistre les paramètres nouveaux et modifiés. La structure est la suivante.

bool WritePrivateProfileString(string name, string key, string value, string filepath);

La fonction renvoie un résultat booléen vrai si l’écriture réussit et faux si l’écriture échoue. Voici les paramètres.

  1. Le nom de la section à écrire est spécifié par name.
  2. Le nom de la clé à définir est spécifié par key.
  3. La valeur de la clé est spécifiée par value.
  4. Le filepath contient l’emplacement du fichier INI à mettre à jour.

Utilisez ReadPrivateProfileString pour lire les données d’un fichier INI en C#

ReadPrivateProfileString lit les données d’un fichier INI. La fonction lit des valeurs uniques, tous les noms de clé d’une section ou tous les noms de section selon son application.

int GetPrivateProfileString(string name, string key, string default, StringBuilder ReturnedVal,
                            int maxsize, string filepath);

Le nombre de caractères dans la valeur renvoyée est renvoyé sous la forme d’un entier non signé par la fonction. Voici les paramètres.

  1. Le nom de la section à lire est spécifié par name. Si cette valeur est définie sur null, tous les noms de section seront renvoyés.
  2. Le nom de la clé à lire est spécifié par key. La valeur renvoyée inclura les noms des clés dans la section donnée si elle est définie à null et si name n’est pas null.
  3. Si la clé n’est pas présente, default spécifie une valeur par défaut à retourner.
  4. ReturnedVal reçoit une chaîne qui sert de tampon. Le résultat de l’opération est écrit dans le tampon, modifiant la valeur de la chaîne.
  5. La taille maximale de la chaîne qui sera renvoyée dans ReturnedVal est spécifiée par maxsize. Cela devrait être le même que la taille de la mémoire tampon. Si la valeur lue dans le fichier INI est supérieure à ReturnedVal, elle sera réduite.
  6. L’emplacement et le nom du fichier INI à lire sont spécifiés par filepath. Ce fichier doit être présent.

Lire et écrire des fichiers INI en C#

Créons une classe pour contenir les structures des fonctions de l’API Windows que nous allons utiliser maintenant que nous avons vu leurs structures.

Ajoutez les bibliothèques suivantes.

using System;
using System.IO;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Text;

Créez une nouvelle classe nommée ReadWriteINIfile et utilisez le code de classe suivant. Comme il n’y a pas de modificateur d’accès pour la classe elle-même, elle aura une portée interne.

La classe IniFile accédera aux fonctions de l’API sans les exposer au public.

public class ReadWriteINIfile {
  [DllImport("kernel32")]
  private static extern long WritePrivateProfileString(string name, string key, string val,
                                                       string filePath);
  [DllImport("kernel32")]
  private static extern int GetPrivateProfileString(string section, string key, string def,
                                                    StringBuilder retVal, int size,
                                                    string filePath);
}

Nous pouvons maintenant construire la classe ReadWriteINIfile, nous permettant de lire des fichiers INI sans connaître les opérations de l’API.

Ajoutez le code suivant à la classe pour créer le constructeur.

public ReadWriteINIfile(string inipath) {
  path = inipath;
}

WritePrivateProfileString est utilisé pour remplir un fichier INI avec des valeurs. Trois arguments sont utilisés dans le code ci-dessous pour accepter les noms de section et de clé et la valeur à enregistrer.

Dans l’appel à WritePrivateProfileString, ces valeurs sont combinées avec le nom de fichier passé au constructeur.

public void WriteINI(string name, string key, string value) {
  WritePrivateProfileString(name, key, value, this.path);
}

Les arguments de ReadINI sont le name et la key à lire. La première ligne du code ci-dessus définit la chaîne de caractères et fixe sa valeur à plusieurs espaces égaux à sa longueur maximale.

La fonction GetPrivateProfileString reçoit cette chaîne sous forme de tampon à remplir. Utilisez le code ci-dessous.

public string ReadINI(string name, string key) {
  StringBuilder sb = new StringBuilder(255);
  int ini = GetPrivateProfileString(name, key, "", sb, 255, this.path);
  return sb.ToString();
}

Code source complet :

using System;
using System.IO;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Text;

namespace Test {
  class Program {
    static void Main(string[] args) {}
  }
  public class ReadWriteINIfile {
    [DllImport("kernel32")]
    private static extern long WritePrivateProfileString(string name, string key, string val,
                                                         string filePath);
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string section, string key, string def,
                                                      StringBuilder retVal, int size,
                                                      string filePath);

    public string path;

    public ReadWriteINIfile(string inipath) {
      path = inipath;
    }
    public void WriteINI(string name, string key, string value) {
      WritePrivateProfileString(name, key, value, this.path);
    }
    public string ReadINI(string name, string key) {
      StringBuilder sb = new StringBuilder(255);
      int ini = GetPrivateProfileString(name, key, "", sb, 255, this.path);
      return sb.ToString();
    }
  }
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn