stringtranslate.com

Archivo INI

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]

Historia

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.

Predominio

Lo que sigue es una lista no exhaustiva de lugares en los que aparecen archivos INI.

Ejemplo

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"       

Formato

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 que 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.

Pares clave-valor

Los datos en INI se almacenan en pares clave-valor llamados clave o propiedad . Por lo tanto, la clave puede referirse a todo el par clave-valor 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  

Secciones

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 emplea 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é,  \ \ \ 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 \ \ .         

Jerarquía (anidamiento de secciones)

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.

Sensibilidad a mayúsculas y minúsculas

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] .

Comentarios

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.

Orden de secciones y propiedades

El orden de las propiedades en una sección y el orden de las secciones en un archivo son irrelevantes.

Nombres duplicados

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 varios 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.

Valores cotizados

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.

Continuación de línea

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 .

Caracteres de escape

Algunos dialectos ofrecen soporte variable para el escape de caracteres , normalmente 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]

Acceder a archivos INI

En Windows, la API de perfil es la interfaz de programación que se utiliza para leer y escribir configuraciones de .iniarchivos 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 GetPrivateProfileStringfunción es el valor predeterminado, que son "127.0.0.1"y 143respectivamente 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.

Comparación de analizadores INI

Asignación de archivos

La asignación de archivos de inicialización crea una asignación entre un archivo INI y el registro de Windows . [57] [58] Se introdujo con Windows NT y Windows 95 como una forma de migrar del almacenamiento de configuraciones en .iniarchivos clásicos al nuevo registro. La asignación de archivos atrapa las llamadas de la API de perfil y, utilizando 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:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\ Versión actual\IniFileMapping

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.

Entonces, en este caso, la llamada de perfil para la sección [propietario] se asigna a:

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

Alternativas

A partir de Windows 95 , Microsoft comenzó a promover fuertemente el uso del registro de Windows en lugar de los archivos INI. [59] 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. [60]

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 arbitrariamente, 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. [61]

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. [62]

Véase también

Referencias

  1. ^ Microsoft TechNet: Configurar un elemento de archivo ini
  2. ^ Archivos de inicialización .conf
  3. ^ Microsoft: Kit de recursos para estaciones de trabajo Windows NT
  4. ^ Microsoft Learn (8 de febrero de 2022). «Cómo personalizar carpetas con Desktop.ini» . Consultado el 10 de enero de 2024 .
  5. ^ Codrut Neagu, "¿Por qué hay dos archivos Desktop.ini en mi escritorio y qué hacen?".
  6. ^ Rasmus Lerdorf, Kevin Tatroe, Peter MacIntyre. "Programación PHP". Secciones "parse_ini_file", "Entradas INI de extensión", etc.
  7. ^ Christian Wenz. "Libro de frases de PHP y MySQL". Sección "Análisis de archivos INI". Cita: "... el formato de archivo INI... se utilizó ampliamente en el mundo de Windows, pero hoy también impulsa la configuración de productos de software como PHP. Por ejemplo,... php.ini"
  8. ^ "ARCHIVO DE CONFIGURACIÓN git-config".
  9. ^ "Formato básico del archivo". especificaciones.freedesktop.org .
  10. ^ "systemd.servicio". www.freedesktop.org .
  11. ^ "afp.conf — Archivo de configuración de Netatalk" . Consultado el 10 de enero de 2024 .
  12. ^ "pacman.conf(5)". archlinux.org .
  13. ^ Manual de funciones de la biblioteca abc libconfini
  14. ^ Documentación de Apache para org.apache.commons.configuration2.INIConfiguration, The Apache Software Foundation
  15. ^ Esto incluye la implementación de Windows. Consulte "Función GetPrivateProfileString". Microsoft Developer Network . Microsoft . Consultado el 2 de junio de 2012 .
  16. ^ El proyecto Git. "config.txt" . Consultado el 10 de enero de 2024 .
  17. ^ El proyecto Git. "config.txt" . Consultado el 10 de enero de 2024 .
  18. ^ El proyecto Git. "config.txt" . Consultado el 10 de enero de 2024 .
  19. ^ Implementación de Cloanto
  20. ^ El proyecto Git. "config.txt" . Consultado el 10 de enero de 2024 .
  21. ^ El proyecto Git. "config.txt" . Consultado el 10 de enero de 2024 .
  22. ^ Es una práctica común entre los autores de archivos INI "comentar" las entradas no deseadas para desactivarlas, en lugar de eliminarlas por completo. Vea la clave aen el siguiente ejemplo:
    [sección] 
    #a=a
    b=b
  23. ^ La sintaxis estándar para la continuación de línea se refiere aquí a la secuencia de una barra invertida seguida de un salto de línea , tal como lo implementan iniparser, libconfini yjava.util.Properties
  24. ^ Fredrik Lundh. "Biblioteca estándar de Python". 2001. Sección "El módulo ConfigParser". pág. 143
  25. ^ "ConfigParser - Analizador de archivos de configuración".
  26. ^ Siguiendo la sintaxis del lenguaje con el que está diseñado para trabajar ( Python ), para abarcar un nodo en varias líneas, ConfigParser requiere una sangría más profunda en las líneas que siguen, en lugar de la barra invertida más común + salto de línea (ver: configparser — Analizador de archivos de configuración)
  27. ^ Documentación de Python por versión
  28. ^ Analizador de archivos clave-valor de GLib
  29. ^ Withnall, Philip (11 de febrero de 2021). "glib 2.66.7". GNOME ftp-release (Lista de correo) . Consultado el 12 de febrero de 2021 .
  30. ^ Lanzamientos · GNOME/glib
  31. ^ documentación del archivo ini
  32. ^ Lanzamientos · inifile
  33. ^ este README
  34. ^ Usando sangría, siguiendo explícitamente el enfoque de ConfigParser (consulte la documentación del proyecto para obtener más información)
  35. ^ Comunicados · benhoyt/inih
  36. ^ documentación de iniparser
  37. ^ Lanzamientos · iniparser/iniparser
  38. ^ Propiedades (Java Platform SE 8)
  39. ^ "OpenJDK: GPLv2 + Classpath Exception". Openjdk.java.net. 1 de abril de 1989. Consultado el 9 de febrero de 2016 .
  40. ^ "BCL para Java SE". Oracle.com. 2 de abril de 2013. Consultado el 9 de febrero de 2016 .
  41. ^ "Versiones de JDK". Oracle Corporation . Consultado el 9 de diciembre de 2022 .
  42. ^ "Versiones de JDK". Oracle Corporation . Consultado el 17 de enero de 2024 .
  43. ^ documentación de libconfini
  44. ^ Lanzamientos · madmurphy/libconfini
  45. ^ PHP . «parse_ini_file() — Analizar un archivo de configuración». Documentación oficial de PHP . Consultado el 19 de julio de 2022 .
  46. ^ Licencia PHP v3.01[1]
  47. ^ "Versión 8.3.12". 26 de septiembre de 2024 . Consultado el 26 de septiembre de 2024 .
  48. ^ PyINI
  49. ^ Etiquetas · whoatemybutter / PyINI
  50. ^ python-ini
  51. ^ Documentación de RudeConfig
  52. ^ Lanzamientos · RudeConfig
  53. ^ "26 de septiembre de 2024: versión preliminar de KB5043145 (compilaciones del SO 22621.4249 y 22631.4249)". Soporte técnico de Microsoft . Microsoft .
  54. ^ "Lanzamiento de Wine 9.0". 16 de enero de 2024. Consultado el 16 de enero de 2024 .
  55. ^ abc "configparser en crates.io". crates.io . 2022-12-12. Archivado desde el original el 2022-12-12 . Consultado el 2022-12-12 .
  56. ^ Página de Github de Java-Ini-Parser
  57. ^ Archivos de inicialización y registro, Kit de recursos de Windows NT Workstation , Microsoft TechNet
  58. ^ Administrar el Registro NT, Administrar el Registro de Windows NT , Paul Robichaux, O'Reilly Media
  59. ^ El Registro del Sistema
  60. ¿ Fue una buena idea el Registro de Windows? – Coding Horror
  61. ^ "Comentario sobre el problema "La compatibilidad con .INI es un objetivo loable" en GitHub". GitHub .
  62. ^ libconfini/README

Enlaces externos