2008-11-06 13 views
41

Necesito almacenar archivos de registro y configuración para mi aplicación. ¿Dónde está el mejor lugar para almacenarlos?¿El mejor lugar para almacenar archivos de configuración y archivos de registro en Windows para mi programa?

Ahora mismo, estoy usando el directorio actual, que termina poniéndolos en el directorio Archivos de programa donde vive mi programa.

El usuario tendrá acceso a los archivos de registro con cierta regularidad, por lo que %APPDATA% parece un poco difícil de encontrar.

¿Es un directorio bajo %USERPROFILE%\My Documents el mejor? Debe funcionar para todas las versiones de Windows, a partir de 2000 en adelante.

+0

Ver también [esta pregunta] (http://stackoverflow.com/questions/1556082/as-a-developer-how-should-i-use-the-special-folders-in-vista-and-windows- 7) –

Respuesta

28

Si no está usando ConfigurationManager para administrar su aplicación y la configuración del usuario, debe ser. El kit de herramientas de configuración en .NET Framework está muy bien pensado, y las herramientas de Visual Studio que interoperan con él también lo son.

El comportamiento predeterminado de ConfigurationManager pone tanto la configuración invariable (aplicación) como la modificable (usuario) en los lugares correctos: la configuración de la aplicación va en la carpeta de la aplicación y la configuración del usuario va en System.Environment.SpecialFolder.LocalApplicationData. Funciona correctamente en todas las versiones de Windows compatibles con .NET.

En cuanto a los archivos de registro, System.Environment.SpecialFolder.LocalApplicationData es generalmente el lugar que desea colocar, ya que se garantiza que el usuario puede escribir.

Hay casos en los que no lo haría, por ejemplo, si desea escribir archivos en un recurso compartido de red para que pueda acceder a ellos de forma remota. Existe una amplia gama de formas de implementarlo, pero la mayoría de ellos comienzan con la creación de una configuración de aplicación que contiene la ruta a la carpeta compartida. Todos ellos implican administración.

Tengo un par de quejas sobre ConfigurationManager y las herramientas VS: es necesario que haya una mejor documentación de alto nivel que la que hay, y una mejor documentación de la clase Settings generada por VS. El mecanismo por el cual el archivo app.config se convierte en el archivo de configuración de la aplicación en el directorio de compilación de destino es opaco (y el origen de una de las preguntas más frecuentes: "¿qué pasó con mi cadena de conexión?"). Y si hay una forma de crear configuraciones que no tienen valores predeterminados, no las he encontrado.

+6

Usar System.Environment.SpecialFolder.LocalApplicationData para la configuración de configuración tiene un inconveniente: no se replica con el perfil móvil, si el usuario se encuentra en un entorno de este tipo. Y tuve una mala experiencia con eso, cuando tuve que modificar mi aplicación más tarde, cuando obtuve usuarios como este. –

+0

Dependiendo de lo que está registrando también. Si los registros son específicos de las ejecuciones de los usuarios, utilice Environment.SpecialFolder.LocalApplicationData. Si acaba de registrar las estadísticas generales de la aplicación, le recomendaría usar Environment.SpecialFolder.CommonApplicationData –

0

Uso el Almacenamiento de aislamiento para la configuración. También puede usar la carpeta Temp para almacenar información temporal, como el registro.

+3

Poner los registros de su aplicación en la carpeta Temp es una mala idea. – RWendi

+0

Esa es tu opinión. Se supone que los registros son temporales ... pueden depender de su aplicación. –

+3

y yo argumentaría que "los registros se supone que son temporales" es también tu opinión. –

1

La mejor respuesta depende de la naturaleza de los registros y las configuraciones. Si son para todo el programa, y ​​no necesitan sobrevivir a la desinstalación de la aplicación, entonces creo que están bien donde están. Si los registros y configuraciones son específicos del usuario, o necesitan sobrevivir a la desinstalación, entonces pertenecen a algún lugar bajo% USERPROFILE% -% APPDATA% que es el directorio base 'apropiado' para este tipo de cosas.

4

No guarde archivos de configuración en la carpeta de la aplicación, Microsoft ha indicado que NO es la ubicación ideal. Windows se ha estado moviendo hacia el bloqueo de la escritura en C: \ Program Files \ y encontrará en Vista cualquier aplicación que intente escribir aquí, activará una advertencia de UAC.

Windows 7 permitirá a los usuarios personalizar qué ventanas emergentes de UAC utilizan (esperan que algunos usuarios avanzados bloqueen la mayoría) y su aplicación fallará/se congelará si el usuario nunca aprueba este intento de escritura.

Si utiliza las variables adecuadas de perfil de usuario y aplicación, Win 2000, XP, Vista y Win7 correlacionarán los datos con la carpeta adecuada para escritura, sin ventanas emergentes de UAC.

8

Para la configuración de la aplicación: use System.Environment.SpecialFolder.ApplicationData: aquí se almacenan los datos de un perfil móvil, por lo que le permite a su usuario iniciar sesión y trabajar desde diferentes máquinas en el dominio.

Para ficheros de log - System.Environment.SpecialFolder.LocalApplicationData

5

para ser honesto% appdata% sigue siendo el mejor lugar para colocar los archivos de configuración y archivos de registro, ya que sirve al propósito de un marcador de posición para almacenar su Datos de la aplicación. No debe ser tan difícil acceder, simplemente escriba% appdata% en el explorador y se lo dirigirá directamente a su directorio% appdata%.

+4

Buen truco ... No sabía acerca de ese% de acceso de% appdata. +1 –

2

Puede utilizar SHGetSpecialFolderPath:

int MAX_PATH = 255; 

CString m_strMyPath; 

SHGetSpecialFolderPath(NULL, m_strMyPath.GetBuffer(MAX_PATH), CSIDL_COMMON_APPDATA, TRUE); 

Esto especificará el 'camino especial carpeta' que se puede escribir de forma segura los registros de windows:

Para XP: C:\Documents and Settings\All Users\Application Data

para Vista: C:\ProgramData

Compruebe la página MSDN aquí: http://msdn.microsoft.com/en-us/library/bb762204(VS.85).aspx

8

Nota: Se puede obtener la ruta a la carpeta LocalApplicationData en .NET mediante la siguiente función:

string strPath=System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData); 
5

La respuesta aceptada señala que para los archivos de registro del siguiente es un buen lugar. System.Environment.SpecialFolder.LocalApplicationData Esto equivale a una ruta de C:\Users\[User]\AppData\Roaming que puede ver es específica del usuario. Al igual que la respuesta aceptada, esta es una ubicación garantizada por el usuario y puede ser útil para ciertas situaciones

Sin embargo, en un entorno de aplicaciones web, puede ejecutar su aplicación bajo una cuenta de red y usted o un compañero de trabajo pueden necesitar rastrear hacia dónde exactamente van esos registros por aplicación. Personalmente me gusta utilizar la enumeración de ubicación no específica de usuario de System.Environment.SpecialFolder.CommonApplicationData que equivale a C:\ProgramData. Sí, deberá especificar los derechos de acceso para las carpetas que cree, pero generalmente es un acuerdo de una sola vez y luego todos los registros de la aplicación pueden vivir en una ubicación feliz.

Además, mientras se mira en torno a Internet, hay un proyecto que hay que establecer mediante programación el acceso de escritura a las carpetas que crea dentro CommonApplicationData, Allow write/modify access to CommonApplicationData.

Cuestiones relacionadas