Leer y escribir archivos INI en C#

Muhammad Zeeshan 12 octubre 2023
  1. ¿Qué es el archivo INI en C#?
  2. Use WritePrivateProfileString para guardar configuraciones nuevas y modificadas en un archivo INI en C#
  3. Utilice ReadPrivateProfileString para leer datos de un archivo INI en C#
  4. Leer y escribir archivos INI en C#
Leer y escribir archivos INI en C#

Este tutorial enseña a leer y escribir archivos INI en C#.

¿Qué es el archivo INI en C#?

Los archivos de inicialización, a menudo llamados archivos INI, son archivos de texto para almacenar información de configuración del programa. El marco .NET no admite archivos INI de forma nativa.

Puede utilizar los métodos de la API de Windows mediante los servicios de invocación de plataforma para escribir en los archivos y leerlos. Este tutorial construirá una clase que representa los archivos INI y los manipulará con las operaciones de la API de Windows.

Para operar con archivos INI, necesitaremos dos funciones de la API de Windows, WritePrivateProfileString y ReadPrivateProfileString.

Use WritePrivateProfileString para guardar configuraciones nuevas y modificadas en un archivo INI en C#

En un archivo INI, WritePrivateProfileString guarda configuraciones nuevas y modificadas. La estructura es la siguiente.

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

La función devuelve un resultado booleano de verdadero si la escritura tiene éxito y falso si la escritura falla. Los siguientes son los parámetros.

  1. El nombre de la sección a escribir se especifica con name.
  2. El nombre de la clave que se establecerá se especifica mediante key.
  3. El valor de la clave se especifica mediante value.
  4. La ruta del archivo contiene la ubicación del archivo INI que se actualizará.

Utilice ReadPrivateProfileString para leer datos de un archivo INI en C#

ReadPrivateProfileString lee datos de un archivo INI. La función lee valores individuales, todos los nombres clave de una sección o todos los nombres de sección según su aplicación.

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

La función devuelve el número de caracteres en el valor devuelto como un entero sin signo. Los siguientes son los parámetros.

  1. El nombre de la sección a leer se especifica con name. Si se establece en nulo, se devolverán todos los nombres de sección.
  2. El nombre de la clave a leer se especifica con key. El valor devuelto incluirá los nombres de las claves en la sección dada si se establece en nulo mientras que el name no es nulo.
  3. Si la clave no está presente, default especifica un valor predeterminado para devolver.
  4. ReturnedVal recibe una cadena que sirve como búfer. El resultado de la operación se escribe en el búfer, modificando el valor de la cadena.
  5. El tamaño máximo de la cadena que se devolverá en ReturnedVal se especifica mediante maxsize. Este debe ser el mismo que el tamaño del búfer. Si el valor leído del archivo INI es mayor que ReturnedVal, se reducirá.
  6. La ubicación y el nombre del archivo INI que se va a leer se especifican mediante filepath. Este archivo tiene que estar presente.

Leer y escribir archivos INI en C#

Hagamos una clase para contener las estructuras de las funciones de la API de Windows que usaremos ahora que hemos visto sus estructuras.

Agregue las siguientes bibliotecas.

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

Cree una nueva clase llamada ReadWriteINIfile y use el siguiente código de clase. Debido a que no hay un modificador de acceso para la clase en sí, tendrá un alcance interno.

La clase IniFile accederá a las funciones de la API sin exponerlas al público.

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);
}

Ahora podemos construir la clase ReadWriteINIfile, que nos permite leer archivos INI sin conocer las operaciones de la API.

Agregue el siguiente código a la clase para crear el constructor.

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

WritePrivateProfileString se usa para llenar un archivo INI con valores. Se utilizan tres argumentos en el código siguiente para aceptar los nombres de sección y clave y el valor que se va a guardar.

En la llamada a WritePrivateProfileString, estos valores se combinan con el nombre de archivo pasado al constructor.

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

Los argumentos de ReadINI son el name y la key para leer. La primera línea del código anterior define la cadena y establece su valor en varios espacios iguales a su longitud máxima.

La función GetPrivateProfileString recibe esta cadena como un búfer para ser poblada. Utilice el código de abajo.

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

Código fuente completo:

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