¿Dónde debo almacenar la configuración específica de la aplicación?

Me han pedido que actualice una aplicación VB6 que se ha estado ejecutando en WinXP durante los últimos 6 años. El cliente quiere usar Windows 7. Hasta ahora, la aplicación almacenaba su configuración en un archivo INI ubicado en el directorio de la aplicación. Una diferencia clave entre XP y 7 es que ya no puede escribir en C:\Program Files\AppFolder .

Estoy tratando de averiguar en qué parte del sistema de archivos debo guardar la configuración? Dado que todavía se requiere que la aplicación se ejecute en WinXP, estoy un poco confundido.

En WinXP, tengo lo siguiente:

 C:\Documents and Settings\profilename\Application Data C:\Documents and Settings\profilename\Local Settings\Application Data 

En Windows 7, tengo lo siguiente:

 C:\Users\profilename\AppData\Local C:\Users\profilename\AppData\LocalLow C:\Users\profilename\AppData\Roaming 

Cada una de estas carpetas tiene subcarpetas que parecen almacenar configuraciones / archivos para varios productos

Entonces 2 preguntas:

  1. Dadas todas estas carpetas, ¿dónde almaceno mi configuración?
  2. Supongo que hay una ingeniosa llamada a la API de Windows que me daría la ubicación correcta de esta carpeta. Y espero que funcione tanto en XP como en 7. ¿Mi suposición es correcta? Si es así, un enlace sería muy apreciado.

Hay una serie de carpetas especiales que puede usar, en XP / Vista / Windows 7:

  • La carpeta CSIDL_APPDATA es la que probablemente le interese más. Los datos almacenados aquí están disponibles para los usuarios itinerantes en cualquier máquina en la que inicien sesión. Este es el mejor lugar para almacenar datos simples de configuración. Todos los usuarios tienen acceso de escritura a esta (y la última) carpeta. Tenga en cuenta que ninguna de las carpetas anteriores son para datos generados por el usuario. Eso debería pertenecer correctamente en la jerarquía Mis documentos.
  • EDITAR: como sugiere Cody Gray en los comentarios, también considere CSIDL_LOCAL_APPDATA para datos de aplicaciones que siempre serán locales para la máquina actual, pero se reservan por usuario. Los datos en esta carpeta no están disponibles en itinerancia, por lo que deberían ser datos que el usuario probablemente no perderá si inicia sesión en una máquina diferente.

Copié desvergonzadamente la explicación anterior de un buen artículo de Karl Peterson, explicando esto para los progtwigdores de VB6. Karl también tiene una clase lista para usar que te ayudará a encontrar los directorios, pero en mi humilde opinión, esta vez es demasiado complicado. Bob Riemersma tiene una mejor manera en una línea , utilizando el objeto Shell , como se muestra a continuación. EDITAR El comentario de Bob a continuación explica por qué es mejor utilizar el enlace tardío para esto en lugar del enlace anticipado .

 Const ssfCOMMONAPPDATA = &H23 Const ssfLOCALAPPDATA = &H1c Const ssfAPPDATA = &H1a Dim strAppData As String strAppData = _ CreateObject("Shell.Application").NameSpace(ssfAPPDATA).Self.Path 

En mi opinión, está bien continuar usando archivos INI en estos directorios.

Consulte la pregunta ” ¿Tiene Microsoft un documento de mejores prácticas con respecto al almacenamiento de datos de la aplicación? ” Para obtener información útil.

Tal vez simplemente guarde su configuración en el Registro de Windows? Eso es muy fácil. Usar SaveSeting y GetSetting es mucho más fácil que crear un archivo INI. Y no hay problemas de compatibilidad, desde WinNT a Windows 8.