2008-10-16 34 views
7

¿Cuál es una forma bastante estándar para almacenar la configuración de la aplicación, principalmente para Windows, pero también es fácil de trasladar a otras plataformas.Configuración de la aplicación

Hay básicamente 4 grupos de ajustes que desea tener:

  • configuración global, afecta a todos los usuarios, y se puede mover entre máquinas
  • configuración global del sistema, afecta a todos los usuarios, pero adaptadas a ese sistema (por ejemplo, valores por defecto para ese sistema, por ejemplo, opciones gráficas)
  • configuración de usuario, la configuración del usuario que se mueven entre los sistemas (por ejemplo, el sonido de volumen)
  • la configuración del sistema del usuario, la configuración de usuario específico de dicho sistema (por ejemplo, opciones gráficas que son dependiente del hardware)

Cada nivel anula el nivel anterior, permitiendo que las "configuraciones globales" sean más grandes que las aplicaciones predeterminadas, con ajustes de usuario que almacenan las opciones que el usuario eligió. Los dos primeros básicamente serán predeterminados cuando no haya configuración de usuario (por ejemplo, para un nuevo usuario).

Consideré la implementación de un conjunto de funciones, que luego pude implementar para los diferentes sistemas (probablemente a través de archivos ini), pero ¿es esta la mejor manera?

(C++)

namespace config 
{ 
    void Init(const std::string &AppName); 
    //updates config for keys/sections that don't exist (ie don't overwrite changes by advanced users by rewriting the entire file) 
    void Defaults   (std::map<std::string,std::map<std::string,std::string> > &Map); 
    void SystemDefaults (std::map<std::string,std::map<std::string,std::string> > &Map); 

    void Set    (const std::string &Section, const std::string &Key, const std::string &Value); 
    void SetSystem   (const std::string &Section, const std::string &Key, const std::string &Value); 

    void SetUser   (const std::string &Section, const std::string &Key, const std::string &Value); 
    void SetUserSystem  (const std::string &Section, const std::string &Key, const std::string &Value); 

    std::string GetValue (const std::string &Section, const std::string &Key); 
} 

Sé que las ventanas tiene un conjunto de directorios para este tipo de configuración, pero éstos son los directorios correctos para mis necesidades?

EDITAR: Prefiero ir con archivos (ini o xml), en lugar de utilizar, por ejemplo, el registro de Windows. Sin embargo, ¿dónde están los mejores lugares para poner estos archivos de configuración en cada sistema operativo?

En Vista, encontré estos, que parecen ajustarse a mis grupos, sin embargo, ¿qué pasa con las versiones anteriores de Windows (necesito compatibilidad con win2000, XP, etc.) y mac/linux tiene sus propias carpetas simelar?

  • ajustes globales - <SYSDRIVE> \ Users \ Default \ AppData \ Roaming
  • configuración del sistema global - <SYSDRIVE> \ Users \ Default \ AppData \ Local
  • Configuración de usuario - <SYSDRIVE> \ Users \ <uSUARIO> \ AppData \ Roaming
  • configuración del sistema
  • usuario - <SYSDRIVE> \ Users \ <uSUARIO> \ AppData \ local

Respuesta

1

Hay (al menos) tres opciones razonables:

de registro: Este es mi menos favorito debido a la portabilidad y la opacidad relativa.

Variables de entorno: Recomiendo usar uno (solo uno) que apunte a un lugar donde se guarda su material: un "directorio de instalación" o algo similar.

Archivos: Tanto el directorio de inicio del usuario (o en un subdirectorio del mismo) como el directorio del proyecto/producto son adecuados para almacenar cosas.

Es posible que desee utilizar un paradigma de palabra clave = valor simple, y reglas básicas para que sus variables - configuraciones - puedan leerse con más de un tipo de código muy fácilmente. Por ejemplo, normalmente utilizo el paradigma Java para los archivos de propiedades y uso el código C de comportamiento coincidente para que ambas líneas de código puedan leer fácilmente la configuración.

+0

Los archivos Well son mi preferido, ya que las mismas cosas funcionarán en todas las plataformas con poco trabajo. El principal problema es dónde deberían estar los archivos y cómo proporcionar una interfaz limpia (por ejemplo, Microsoft no parece querer aplicaciones trabajando con archivos en el propio directorio de aplicaciones ... id esté contento con% username% .ini). –

6

Si usted es un usuario impulso, es posible echar un vistazo a la biblioteca program options, se admite el uso de archivos de configuración, así como las variables de entorno y (por supuesto) las opciones de línea de comandos.

Está diseñado para ser portátil, por lo que debería aliviar sus dolores de cabeza en varias plataformas.

Cuestiones relacionadas