¿Archivos INI o registro o archivos personales?

19

Quiero guardar la configuración de mi proyecto que incluye

  1. Tamaño de pantalla
  2. Posición de la pantalla
  3. Rutas de carpeta
  4. Configuración de usuarios, etc.

Los lugares estándar donde puede guardar estos valores de configuración son:

  1. Registro
  2. Archivos INI
  3. Archivos personales (como * .cfg)

¿Cómo eliges entre estos lugares? Además, ¿hay ventajas y desventajas de usar alguna de ellas?

Shirish11
fuente
2
¿Qué herramientas Estas usando? Algunas tecnologías vienen con herramientas de administración de configuración bastante agradables.
@ Pierre303 actualmente usa VS 2008 para VC ++
Shirish11
¿Los usuarios deberán realizar cambios?
JeffO
1
¿Has considerado YAML? Obtienes lo mejor de ambos, ini y xml en.wikipedia.org/wiki/YAML
JF Dion

Respuestas:

20

¿También hay ventajas y desventajas de usar alguna de ellas?

Registro:

  • + Relativamente estándar en el entorno de Windows.
  • + Generalmente buen soporte de instaladores, etc.
  • - API específica de plataforma, si alguna vez desea portar su aplicación.
  • - No particularmente legible para humanos.

Archivos INI:

  • + Formato simple
  • + Portátil.
  • + Legible por humanos.
  • - Puede ser difícil almacenar información más compleja (por ejemplo, cualquier cosa anidada a más de dos niveles de profundidad).
  • ?Puede que tenga que escribir su propio analizador (aunque no es difícil) o usar una biblioteca externa como SimpleIni (gracias a Jonathan Merlet por el comentario).

Archivos XML (supongo que esta es la opción .cfg):

  • + Un formato estándar.
  • + Portátil.
  • + Admite estructuras profundamente anidadas.
  • - No particularmente legible para humanos.

Personalmente, para las aplicaciones de Windows, tiendo a usar C # e ir con un archivo personal para el usuario, almacenado como XML. Lo hago normalmente porque la legibilidad humana no suele ser una prioridad en los tipos de aplicaciones que escribo (y la aplicación debe tener un editor de configuración, en cualquier caso), y en el entorno .NET , es muy fácil trabajar con XML. Muy a menudo termino con un objeto UserConfiguration que simplemente se serializa hacia y desde un archivo de configuración, casi sin desarrollo involucrado (análisis, envío de material), y tiene su configuración lista para usar en un entorno fuertemente tipado.

Daniel B
fuente
Utilicé SimpleIni para analizar archivos INI hace un tiempo y estaba funcionando bien.
Jonathan Merlet
@JonathanMerlet gracias, agregué SimpleIni a la publicación.
Daniel B
15

Yo iría con archivos INI, son la opción más amigable para los humanos:

[window]
width       = 600
height      = 350
position.x  = 400
position.y  = 200

[paths]
path1       = "/some/random/path/"
path2       = "/some/other/random/path/"

[user]
name        = "Yannis"
preference  = "INI"

XML puede ser una buena opción, pero no puede vencer la simplicidad y elegancia de INI:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <window>
        <width>600</width>
        <height>350</height>
        <position>
            <x>400</x>
            <y>200</y>
        </position>
    </window>
    <paths>
        <path1>/some/random/path/</path1>
        <path2>/some/other/random/path/</path1>
    </paths>
    <user>
        <name>Robert</name>
        <preference>XML</preference>
    </user>
</configuration>

Los INI también se entienden muy bien y son independientes de la plataforma. Probablemente no hay tantas herramientas disponibles para ellos como para archivos XML, porque, bueno, ¿quién necesita una herramienta especializada para leer y editar un archivo INI?

Yannis
fuente
2
Es gracioso, pero el XML me parece más bonito y más fácil de leer. Para aquellos que no les gusta la verbosidad, JSON es una alternativa adecuada.
Robert Harvey
3
@RobertHarvey JSON me gusta (y volvería a usar si necesitaba anidación más profundo), pero XML realmente no es mi taza de té ...
Yannis
2
XML se puede hacer más agradable mediante la conversión de valores en atributos. Por ejemplo,<window width="600" height="350" />
Robert Harvey
De hecho, estoy sorprendido de que nadie haya mencionado YAML todavía. Siento que es un toque más amigable para los humanos que JSON, pero bastante similar en capacidad y sintaxis. Sin embargo, el sitio web yaml.org probablemente asusta a cualquiera que no esté familiarizado con él.
Daniel B
@DanielB Alguien mencionó YAML ;)
yannis
6

Mi preferencia son los archivos XML. Son jerárquicos, puede doblarlos a su voluntad de casi cualquier forma imaginable, son bien entendidos, independientes de la plataforma y hay una amplia gama de software disponible para leerlos y escribirlos.

Robert Harvey
fuente
66
Pero horriblemente detallado y tienden a no ser legibles para los humanos después de todo (piense que no está sangrado o hinchado al máximo con declaraciones de espacio de nombres y otras bs).
Manjabes
1
@Manjabes: características que probablemente no sean significativas para los archivos de configuración.
Robert Harvey
@robert harvey: muy significativo donde vivo. Para la intromisión básica con la configuración, use la interfaz gráfica de usuario, para la configuración avanzada vaya a editar el ini.
Pieter B
6

Para ampliar la sugerencia de Jeff D de YAML , aquí hay una breve introducción.

YAML es similar a JSON (de hecho, JSON es un subconjunto de YAML desde la versión 1.2 del estándar YAML y, por lo tanto, los analizadores YAML pueden analizar JSON válido). A primera vista, la principal diferencia es que YAML (por defecto) usa sangría en lugar de corchetes para mostrar la jerarquía. También hay una notable falta de comillas para las cadenas. Un ejemplo rápido de arriba:

configuration:
  window: 
    width:       600
    height:      350
    position:
      x:         400
      y:         200
  paths:
    path1:       some/random/path
    path2:       some/other/random/path
  user:
    name:        Joe Soap
    preference:  YAML

Consulte la página YAML de Wikipedia para obtener mejores ejemplos. Existe soporte para YAML para la mayoría de los idiomas principales (consulte yaml.org para más detalles).

Daniel B
fuente
3

Olvidó una opción: la base de datos. Esto se usa principalmente en escenarios en los que los usuarios inician sesión en su aplicación cuando su aplicación no puede confiar en el usuario de Windows conectado. Esto es, por ejemplo, cuando su aplicación se ejecuta en una ventana de modo quiosco.

Pieter B
fuente
Es posible que necesite un archivo INI o una clave de registro para guardar los detalles de conexión / cadena en la base de datos
Clase Esqueleto
@CamelCase Inifile o clave de registro ya se mencionó en la pregunta, pero no en la base de datos. No quise decir que no puedes usar varios métodos al mismo tiempo.
Pieter B
1

Mi preferencia personal son los archivos XML:

En la mayoría de los casos, no espero que el usuario tenga que editar sus ajustes de configuración, por lo que el problema de legibilidad humana no es un argumento en este caso.

Si necesitan editarlos, puede proporcionar una herramienta de edición, esto evita que el usuario haga algo tonto con los datos. Si desean restaurar la configuración predeterminada, puede decirles que eliminen el archivo x, lo que la mayoría de los usuarios se sentirán cómodos haciendo.

Tenga en cuenta que aún debe tener cuidado de tener permiso para almacenar su archivo, ya que algunas ubicaciones no tienen acceso de escritura de forma predeterminada en Windows 7, etc.


Los archivos INI son una buena forma estándar de almacenar la configuración y se prueban y prueban, ¡pero me parecen un poco 'Windows 3.1'!

Probablemente la mejor opción si desea que el usuario pueda jugar con sus datos


Yo personalmente me alejaría del registro. Por un lado, no puede garantizar que el usuario tenga los permisos necesarios para leer / escribir en el lugar donde desee almacenar sus datos.

En sistemas operativos más recientes donde la virtualización del registro entra en juego, esto puede causar una gran confusión porque no puede 'ver' la configuración virtualizada; esto nos ha mordido más de una vez donde hemos pasado horas tratando de descubrir por qué algo no funcionaba.

Matt Wilko
fuente
3
Si le preocupan los permisos para ubicaciones de registro, entonces probablemente esté tratando de almacenarlos en el lugar equivocado. El usuario debe tener permisos para la sección HKey_Current_User, ¡y ahí es donde debe estar la configuración por usuario!
Neil White
@NeilWhite: acordó que deberían tener permisos, pero un administrador de TI excesivamente entusiasta puede cambiar esto (o dar lectura / escritura pero no crear permisos). Además, el OP no mencionó que estas configuraciones eran necesariamente por usuario , pueden ser por máquina.
Matt Wilko
Además, el registro puede tener un límite de tamaño. Los archivos no.
linquize