Extensión de nombre de archivo | .ini |
---|---|
Tipo de medio de Internet | texto/sin formato, aplicación/editortexto, zz-application/zz-winassoc-ini |
Tipo de formato | Archivo de inicialización/configuración |
Un archivo INI es un archivo de configuración para software de computadora que consiste en texto simple con una estructura y sintaxis que comprende pares clave-valor organizados en secciones. [1] El nombre de estos archivos de configuración proviene de la extensión de nombre de archivo INI , abreviatura de initialization (inicialización) , utilizada en el sistema operativo MS-DOS que popularizó este método de configuración de software. El formato se ha convertido en un estándar informal en muchos contextos de configuración, pero muchas aplicaciones en otros sistemas operativos usan extensiones de nombre de archivo diferentes, como conf y cfg . [2]
El mecanismo principal de configuración de software en Windows era originalmente un formato de archivo de texto que comprendía líneas de texto con un par clave-valor por línea, organizado en secciones. Este formato se utilizaba para componentes del sistema operativo, como controladores de dispositivos, fuentes y lanzadores de inicio. Los archivos INI también se utilizaban generalmente en las aplicaciones para almacenar configuraciones individuales. [3]
El formato se mantuvo en las plataformas Microsoft Windows de 16 bits hasta Windows 3.1x . A partir de Windows 95, Microsoft favoreció el uso del Registro de Windows y comenzó a disuadir a los desarrolladores de utilizar archivos INI para la configuración. Todas las versiones posteriores de Windows han utilizado el Registro de Windows para la configuración del sistema, pero las aplicaciones creadas en .NET Framework utilizan archivos XML .config especiales . Las funciones de archivo de inicialización aún están disponibles en Windows y los desarrolladores aún pueden utilizarlas.
Además del software de Windows, el software independiente de la plataforma puede utilizar este formato de archivo para la configuración. Algunos archivos de configuración similares a Unix también utilizan un formato similar. INI es legible para humanos y fácil de analizar, por lo que es un formato utilizable para archivos de configuración que no requieren mucha mayor complejidad.
Lo que sigue es una lista no exhaustiva de lugares en los que aparecen archivos INI.
Desktop.ini
Los archivos todavía se utilizan en Windows para configurar propiedades de directorios, por ejemplo, para especificar el icono de una carpeta. [4] [5]php.ini
emplea el formato INI. [6] [7].git/config
está escrito en formato INI. [8]*.desktop
están escritas en formato INI. [9]*.service
se escriben en INI. [10]afp.conf
está escrito en un lenguaje de configuración de estilo INI. [11]pacman.conf
está escrito en INI. [12]El siguiente archivo de ejemplo tiene dos secciones: una para el propietario del software y otra para una conexión a la base de datos de nóminas. Los comentarios registran la última persona que modificó el archivo y el motivo de la modificación.
; última modificación el 1 de abril de 2001 por John Doe [propietario] nombre = John Doe organización = Acme Widgets Inc. [base de datos] ; use la dirección IP en caso de que la resolución del nombre de la red no funcione servidor = 192.0.2.62 puerto = 143 archivo = "payroll.dat"
En un sentido más amplio, INI es un formato informal que se presta bien a la implementación ad hoc y que, al mismo tiempo, sigue siendo configurable por el ser humano. En consecuencia, existen muchas especificaciones diferentes (en las que, a veces, la implementación de un analizador es la única especificación escrita), llamadas dialectos INI .
Las interpretaciones de INI dependen en gran medida del gusto personal y de las necesidades del entorno informático, como la conservación de espacios en blanco, la información sobre el tipo de campo, la distinción entre mayúsculas y minúsculas o los delimitadores de comentarios preferidos. Esto hace que INI sea propenso a la proliferación. No obstante, las implementaciones con sabor a INI suelen compartir características de diseño comunes: un archivo de texto que consta de un par clave-valor en cada línea, delimitado por un signo igual , organizado en secciones indicadas por corchetes.
Existen intentos de crear analizadores capaces de soportar tantos dialectos como sea posible, [13] y en su interpretación más complicada, el formato INI es capaz de expresar S-expresiones arbitrarias , haciéndolo equivalente a formatos estandarizados como XML o JSON , aunque con una sintaxis que no está escrita en piedra y para algunos puede resultar más cómoda.
Como el formato de archivo INI no está definido de forma rígida, muchos analizadores admiten funciones que van más allá de las que forman el núcleo común. La compatibilidad implementada es muy volátil.
Los datos en INI se almacenan en pares clave-valor llamados clave o propiedad . Por lo tanto, la clave puede referirse al par clave-valor completo o solo a su clave. Un valor también se llama nombre de propiedad . En su representación textual, el par clave-valor se representa mediante una línea o varias líneas donde el inicio del valor se indica mediante un delimitador , generalmente un signo igual ( =
, ASCII 0x3D) pero a veces también dos puntos ( :
, ASCII 0x3A) o un espacio en blanco (usado ocasionalmente en el mundo GNU [13] ). La clave de la clave aparece a la izquierda del delimitador, a menudo no está vacía y no debe contener el delimitador. Algunas variantes permiten secuencias de escape en el valor.
En la implementación de Windows, el signo igual y el punto y coma son caracteres reservados y no pueden aparecer en la clave. El analizador elimina cualquier espacio en blanco que rodee la clave. El valor puede contener cualquier carácter (en el estilo de Windows, no hay espacios en blanco alrededor del delimitador: por ejemplo, IconFile=Folder.ico
).
Los pares clave-valor pueden verse textualmente así:
clave = clave=v nombre = valor sem = ; semver = v5822.433.2
Los pares clave-valor se pueden agrupar bajo una sección . Algunos dialectos INI requieren que cada par clave-valor esté en una sección, algunos permiten las llamadas propiedades globales . [14] Cuando se agrupan pares clave-valor, el nombre de la sección aparece en una línea por sí mismo, encerrado entre corchetes ( [
, ASCII 0x5B y ]
, ASCII 0x5D), y se aplica a todos los pares clave-valor en líneas posteriores hasta que se declare otra sección. No hay un delimitador explícito de "fin de sección" (como por ejemplo XML </tag>
. Por lo tanto, las secciones sintácticamente no se pueden anidar arbitrariamente. Cuando sea necesario, la anidación se puede implementar aplanando la jerarquía y concatenando con un carácter delimitador personalizado dentro del nombre de la sección (a menudo .
, ASCII 0x2E). A menudo se admite un nivel de anidación, llamado subsecciones .
Ejemplo de documento INI que utiliza secciones anidadas:
[proyecto] nombre = servicio de alquiler de huertos (con aplicación) región de destino = "Área de la Bahía" ; TODO: anunciar puestos vacantes equipo legal = (vacante) [fruta "manzana"] cuestiones de marca registrada = sabor previsible = conocido [fruta.Fecha] sabor = novedoso Problemas de marca registrada = "realmente improbable" [fruta "Frambuesa"] Problemas previstos = "logística (fruta frágil)" Problemas de marca registrada = \ posibles [fruit.raspberry.proponents.fred] date = 2021-11-23, 08:54 +0900 comment = "Me gustan las frutas rojas." [fruit "Date/proponents/alfred"] comment : Por qué, \ \ \ Yo compraría dátiles. # fold: ¿"\\\\\nn" se interpreta como "\\n" o "\n"? # ¿O "\\\\" evita el fold? editor = Mi nombre puede contener una nueva línea \ \ .
Algunos analizadores permiten la anidación de secciones, utilizando puntos como delimitadores de ruta:
[sección] dominio = ejemplo.com [sección.subsección] foo = bar
En algunos casos también se admite la anidación relativa, donde un punto inicial expresa la anidación con la sección anterior: [13]
[sección] dominio = ejemplo.com [.subsección] foo = bar
Históricamente, también han existido formas de expresar la anidación alternativas al punto (por ejemplo, el archivo del controlador de IBM para Microsoft Windows devlist.ini
, en el que se usaba la barra invertida[A\B\C]
como delimitador de anidación en la forma de ; o el archivo de Microsoft Visual Studio AEMANAGR.INI
, que usaba una sintaxis completamente diferente en la forma de [A]
y B,C,P = V
). Algunos analizadores no ofrecían soporte de anidación en absoluto y eran ciegos a la jerarquía, pero la anidación aún podía emularse parcialmente explotando el hecho de que [A.B.C]
constituye un identificador único.
Los nombres de secciones y propiedades en Windows no distinguen entre mayúsculas y minúsculas . [15] La mayoría de las interpretaciones INI de estilo Unix prohíben por completo la distinción entre mayúsculas y minúsculas, aunque a veces se permite la distinción entre mayúsculas y minúsculas para el nombre de sección [16] o la clave [17] .
Una línea con un espacio en blanco contiguo al final seguido de un punto y coma ( ;
, ASCII 0x3E) indica un comentario . Algunos dialectos INI además permiten el uso del signo de número ( #
, ASCII 0x23) para denotar un comentario, reflejando los comentarios del shell de Unix . Algunos dialectos INI, pero no todos, permiten un comentario en una línea de par clave-valor o línea de sección (llamado comentario en línea ), donde algunos requieren un espacio en blanco que separe el valor o el corchete de cierre de sección del comentario. No obstante, el signo de número puede estar incluido en el nombre de la clave en algunos dialectos e ignorado como tal. Las líneas de comentario están diseñadas para ser ignoradas por un analizador.
#! /bin/convert-ini-to-perl | perl | ssh wikipedia.org upload --sanitise=no ; Ambiguo sin mayor conocimiento del dialecto INI: ; ¿el valor es "live" o "live # dangerously"? Me gusta = live # dangerously #var = avar = a ; Este es un comentario en línea foo = bar # Este es otro comentario en línea
Bajo el dialecto GetPrivateProfileString de WinAPI , los comentarios deben aparecer en líneas separadas.
El orden de las propiedades en una sección y el orden de las secciones en un archivo son irrelevantes.
La mayoría de las implementaciones solo admiten tener una propiedad con un nombre determinado en una sección. La segunda aparición de un nombre de propiedad puede provocar un aborto , puede ignorarse (y descartarse el valor) o puede anular la primera aparición (y descartar el primer valor). Algunos programas utilizan nombres de propiedad duplicados para implementar propiedades con múltiples valores.
La interpretación de declaraciones de varias secciones con el mismo nombre también varía. En algunas implementaciones, las secciones duplicadas simplemente fusionan sus propiedades, como si estuvieran ocurriendo de manera contigua. Otras pueden anular o ignorar algún aspecto del archivo INI.
Algunas implementaciones permiten que los valores se escriban entre comillas, generalmente mediante comillas dobles o apóstrofos . Esto permite la declaración explícita de espacios en blanco o el uso de comillas para caracteres especiales (símbolos de igual, punto y coma, etc.). La función estándar de Windows GetPrivateProfileString admite esto y eliminará las comillas que rodean los valores.
Emulando la sintaxis C , algunos dialectos permiten el plegado de línea mediante una barra invertida ( \
, ASCII 0x5C) como el último carácter de una línea. [18] En dicha continuación de línea , las barras invertidas seguidas inmediatamente por EOL (fin de línea) hacen que se eliminen la barra invertida y el salto de línea, transformando las líneas del documento en líneas lógicas .
Algunos dialectos ofrecen soporte variable para el escape de caracteres , típicamente con el carácter de barra invertida ( , ASCII\
0x5C) como metacarácter y emulando la sintaxis C. [19]
No es prudente interpretar ciegamente las secuencias de escape, ya que algunas especificaciones silencian explícitamente su metacarácter para las secuencias de escape comunes. [20] [21]
Secuencia | Significado |
---|---|
\\ | \ (una sola barra invertida , que escapa del carácter de escape) |
\' | Apóstrofe |
\" | Comillas dobles |
\0 | Carácter nulo |
\a | Campana/Alerta/Audible |
\b | Retroceso , carácter de campana para algunas aplicaciones |
\t | Carácter de tabulación |
\r | Retorno de carro |
\n | Avance de línea |
\; | Punto y coma |
\# | Signo de numero |
\= | Signo igual |
\: | Colon |
\xhhhh | Carácter Unicode con punto de código 0xhhhh, codificado en UTF-8 o codificación local |
En Windows, la API de perfil es la interfaz de programación que se utiliza para leer y escribir configuraciones de .ini
archivos clásicos de Windows. Por ejemplo, la función GetPrivateProfileString recupera una cadena de la sección especificada en un archivo de inicialización. (El perfil "privado" se contrasta con GetProfileString
, que obtiene datos de WIN.INI ).
El siguiente programa C de ejemplo demuestra cómo leer valores de propiedad del archivo INI de ejemplo anterior (el nombre del archivo de configuración sea dbsettings.ini
):
#include <windows.h> int principal ( int argc , _TCHAR * argv []) { _TCHAR servidor_base_de_datos [ 1000 ]; int puerto_base de datos ; GetPrivateProfileString ( "base de datos" , "servidor" , "127.0.0.1" , dbserver , sizeof ( dbserver ) / sizeof ( dbserver [ 0 ]), ". \\ dbsettings.ini" ); dbport = GetPrivateProfileInt ( "base de datos" , "puerto" , 143 , ". \\ dbsettings.ini" ); // NB WritePrivateProfileInt() no existe, solo WritePrivateProfileString() devuelve 0 ; }
El tercer parámetro de la GetPrivateProfileString
función es el valor predeterminado, que son "127.0.0.1"
y 143
respectivamente en las dos llamadas de función anteriores. Si el argumento suministrado para este parámetro es NULL
, el valor predeterminado es una cadena vacía, ""
.
En Unix, existen muchas bibliotecas de configuración diferentes para acceder a los archivos INI. A menudo, ya están incluidas en los marcos y kits de herramientas. Algunos ejemplos de analizadores INI para Unix son GLib, iniparser y libconfini.
Nombre | Secciones de apoyo | Soporte de anidación de secciones | Reconocimiento de entrada para discapacitados [22] | Soporte multi-línea [23] | Tipos de valores | Soporte de lectura/escritura | Plataforma | Licencia | Lenguaje de programación | Última versión de lanzamiento |
---|---|---|---|---|---|---|---|---|---|---|
Analizador de configuración de Python [24] [25] | Sí | Sí | No | No estándar [26] | Booleano , Número , Cadena | Leer + escribir | *BSD , Linux , macOS , Windows | Liga de Fútbol Profesional | C (implementación), Python (uso) | 3.9.7 [27] |
GLib [28] | Sí | Sí | No | No | Booleano , Número , Cadena , Matriz | Leer + escribir | *BSD , Linux , macOS , Windows | Licencia LGPL | do | 2.66.7 (11 de febrero de 2021 [±] [29] (2021-02-11) [30] | )
archivo ini [31] | Sí | No | No | No | Booleano , Número , Cadena | Leer + escribir | *BSD , Linux , macOS , Windows | apache | Ir | 1.2.0 [32] |
Éste [33] | Sí | No | No | No estándar [34] | Booleano , Número , Cadena | Leer | *BSD , Linux , macOS , Windows | BSD | do | 53 [35] |
Analizador de inicio [36] | Sí | No | No | Sí | Booleano , Número , Cadena | Leer + escribir | *BSD , Linux , macOS , Windows | Instituto Tecnológico de Massachusetts (MIT) | do | 4.2.4 [37] |
Java (vía java.util.Properties ) [38] | No | No | No | Sí | Cadena | Leer + escribir | Independiente de la plataforma | Doble licencia: GPL versión 2 con excepción de classpath, [39] y una licencia propietaria . [40] | C (implementación), Java (uso) | 23.0.1 (15 de octubre de 2024 [±]
21.0.5 LTS (15 de octubre de 2024 [42] ) [±]
17.0.13 LTS (15 de octubre de 2024 [43] ) [±]
11.0.25 LTS (15 de octubre de 2024 [44] ) [±]
8u431 LTS (15 de octubre de 2024 [45] ) [±] (2024-10-15) |
libconfini [46] | Sí | Sí | Sí | Sí | Booleano , Número , Cadena , Matriz | Leer | *BSD , Linux , macOS , Windows | Licencia pública general (GPL) | do | 1.16.2 [47] |
PHP (vía parse_ini_file() ) [48] | Sí | Sí | Sí | No | Número , cadena , nulo | Leer | Linux , macOS , Windows | Licencia PHP v3.01 [49] | C (implementación), PHP (uso) | 8.3.13 [50] (24 de octubre de 2024 (24 October 2024) | )
PyINI [51] | Sí | No | Sí | Sí | Booleano , Número , Cadena | Leer + escribir | Independiente de la plataforma | Licencia pública general (GPL) | Pitón | 1.0 [52] |
python-ini [53] | Sí | No | No | Sí | Booleano , Número , Cadena , Nulo | Leer + escribir | Independiente de la plataforma | BSD | Pitón | 1.1.0 |
Configuración grosera [54] | Sí | No | No | No | Booleano , Número , Cadena | Leer + escribir | Linux , ventanas | Licencia pública general (GPL) | C++ | Descontinuado: la última versión es 5.0.5, de noviembre de 2009 [55] |
API de Windows | Sí | No | No | No | Número , cadena , estructura | Leer + escribir (no destructivo) | Ventanas | Propiedad | do | 24H2 (10.0.26100.2161) (24 de octubre de 2024 [±] (2024-10-24) | [56] )
Wine (implementación de la API de Windows ) | Sí | No | No | No | Número , cadena , estructura | Leer + escribir (no destructivo) | Linux , macOS , Windows | Licencia LGPL | do | 9.0 [57] 16 de enero de 2024 (16 January 2024) |
Analizador de configuración de Rust [58] | Sí | No | No | No | Booleano , Número , Cadena | Leer + escribir | *BSD , Linux , macOS , Windows | MIT o LGPL v3.0+ | Óxido | 3.0.2 [58] 11 de septiembre de 2022; hace 3 meses |
analizador java-ini [59] | Sí | No | Sí | Sí | Booleano , Número , Cadena | Leer + escribir | Independiente de la plataforma | apache | Java | 1.4 [58] 29 de diciembre de 2022; hace 3 días |
Nombre | Secciones de apoyo | Soporte de anidación de secciones | Reconocimiento de entrada para discapacitados | Soporte multi-línea | Tipos de valores | Soporte de lectura/escritura | Plataforma | Licencia | Lenguaje de programación | Última versión de lanzamiento |
La asignación de archivos de inicialización crea una asignación entre un archivo INI y el registro de Windows . [60] [61] Se introdujo con Windows NT y Windows 95 como una forma de migrar del almacenamiento de configuraciones en .ini
archivos clásicos al nuevo registro. La asignación de archivos atrapa las llamadas de la API de perfil y, utilizando las configuraciones de la sección IniFileMapping Registry, dirige las lecturas y escrituras a los lugares apropiados en el Registro.
Usando el ejemplo a continuación, se podría hacer una llamada de cadena para obtener la clave de nombre de la sección del propietario desde un archivo de configuración llamado, por ejemplo, dbsettings.ini
. El valor devuelto debería ser la cadena "John Doe":
GetPrivateProfileString ( "propietario" , "nombre" , ... , "c:\\programas\\programaantiguo\\dbsettings.ini" );
El mapeo INI toma esta llamada API de perfil, ignora cualquier ruta en el nombre de archivo dado y verifica si hay una clave de registro que coincida con el nombre de archivo en el directorio:
Si existe, busca un nombre de entrada que coincida con la sección solicitada. Si se encuentra una entrada, la asignación INI utiliza su valor como un puntero a otra parte del Registro. Luego, busca la configuración INI solicitada en esa parte del Registro.
Si no se encuentra ningún nombre de entrada coincidente y hay una entrada con el nombre de entrada (predeterminado) , la asignación INI utiliza ese nombre en su lugar. Por lo tanto, cada nombre de sección no necesita su propia entrada.
(Por defecto) | @USR:Software\oldprogs\inisettings\all |
base de datos | USR:Software\oldprogs\inisettings\db |
Entonces, en este caso, la llamada de perfil para la sección [propietario] se asigna a:
nombre | Juan Pérez |
organización | Productos Acme |
donde se encuentra que el nombre de la entrada del Registro " namedbsettings.ini
" coincide con la clave INI solicitada. El valor de "John Doe" se devuelve a la llamada de Perfil. En este caso, el prefijo @ en el valor predeterminado evita que se realicen lecturas al archivo en el disco. El resultado es que cualquier configuración que no se encuentre en el Registro no se busca en el archivo INI.
La entrada del Registro " base de datos " no tiene el prefijo @ en el valor; por lo tanto, solo[database]
para la sección , se toman primero las configuraciones en el Registro, seguidas de las configuraciones en el archivo en el disco.dbsettings.ini
A partir de Windows 95 , Microsoft comenzó a promover fuertemente el uso del registro de Windows en lugar de los archivos INI. [62] Los archivos INI suelen estar limitados a dos niveles (secciones y propiedades) y no manejan bien los datos binarios. Esta decisión, sin embargo, no ha estado exenta de críticas, debido al hecho de que el registro es monolítico, opaco y binario, debe estar sincronizado con el sistema de archivos y representa un único punto de falla para el sistema operativo. [63]
Más tarde, los archivos de configuración basados en XML se convirtieron en una opción popular para codificar la configuración en archivos de texto. [ cita requerida ] XML permite niveles arbitrariamente complejos y anidamiento, y tiene mecanismos estándar para codificar datos binarios .
Más recientemente, los formatos de serialización de datos , como JSON , TOML y YAML, pueden servir como formatos de configuración. Estos tres formatos alternativos pueden anidarse de forma arbitraria, pero tienen una sintaxis diferente a la del archivo INI. Entre ellos, TOML es el que más se parece a INI, pero se rechazó la idea de hacer que TOML fuera deliberadamente compatible con un gran subconjunto de INI. [64]
Sin embargo, los analizadores INI más nuevos permiten el mismo nivel arbitrario de anidamiento de XML , JSON , TOML y YAML , ofrecen soporte equivalente de valores tipificados y Unicode , aunque mantienen el "estatus informal" de los archivos INI al permitir múltiples sintaxis para expresar lo mismo. [65]
php.ini
"a
en el siguiente ejemplo:[sección]
#a=a
b=b
java.util.Properties