Cosas mías

May 18, 2006

Ficheros INI al estilo clásico con diccionarios

Filed under: Programación

De todos es conocido que el registro es una castaña para guardar la configuración de un programa, y más aún si el programa va a permitr que el propio usuario la toque a mano sin que el programa esté cargado, como es el caso de Opera y de otro mucho software, generalmente OpenSource.

El .NET Framework dispone de dos sistemas para guardar la configuración de una aplicación. El sistema más sencillo es colocar un archivo con el mismo nombre del ensamblado y con la extensión .config. La limitación de este sistema es que es de sólo lectura y compartido entre todos los usuarios. Otra castaña, vamos.

El segundo es bastante más poderoso. Consiste en utilizar flujos y guardar en ellos los componentes que queramos. También tiene sus limitaciones, algunas de ellas desesperantes. No se pueden guardar fichas (o al menos yo no he podido), toda clase/componente ha de tener la propiedad [Serializable] (que automáticamente hereda de Iformatter añadiendo bastante tamaño a los objetos instanciados), y sólo se pueden guardar en serie como si de una pila corriente y moliente se tratara. Si queremos sacar el tercer componente guardado, hemos de sacar los dos anteriores, y si una vez extraído ese queremos obtener el anterior, debemos cerrar y volver a abrir el flujo. Otra pasada castañera, vamos.

Pero las limitaciones no terminan ahí, no. Los ficheros en donde se almacenan los datos pueden ser binarios o XML. Los binarios no tienen ninguna limitación si no es la de que nadie sabe qué hay dentro (que para el propósito que nos ocupa no nos sirven), y los XML son incapaces de almacenar la mitad de cosas… Vamos, otra castaña más.

¿Cuál es la solución? Pues volver al tradicional fichero INI de toda la vida, el mayor invento en archivos de configuración. Podríamos treabajar con fichero XML, pero son bastante complejos de leer a mano por un ser humano y encima los sistemas para acceder a ellos son enormemente lentos.

Por eso acabo de terminar de codificar una clase para trabajar con ficheros INI de texto para mi programa. La he realizado utilizando un diccionario que contiene otro diccionario, de la forma que a la hora de acceder a un elemento de una sección es enormemente sencilla:

String ^elem=iniFile[seccion][nombre];

De esta forma, si accedemos a un elemento inexistente, el objeto devolverá una cadena vacía, y si asignamos algo nuevo, se crearán las secciones correspondientes automáticamente.

También he creado los métodos tradicionales del API de Win16, ReadString, etc. Bueno, aunque de momento sólo tengo implementados la obtención de una cadena y de un entero, fijándose en el código se puede implementar trivialmente casi cualquier otro tipo de dato básico.

Lo curioso del tema es que una vez que la he terminado me he dado cuenta de que mediante diccionarios es imposible mantener los comentarios, pues una vez que se escribe de nuevo el fichero, éstos se pierden, pero aun así todavía es útil. Quizás más adelante implemente una nueva clase con otro tipo de estructura de datos que permita mantener los comentarios.

Los ficheros de código fuente se pueden bajar de aquí.

Get free blog up and running in minutes with Blogsome
Theme designed by Gary Rogers