WPF / C #: ¿Dónde debo guardar los archivos de preferencias del usuario?

¿Cuál es la ubicación recomendada para guardar los archivos de preferencias del usuario? ¿Hay un método recomendado para tratar con las preferencias del usuario?

Actualmente utilizo la ruta devuelta desde typeof(MyLibrary).Assembly.Location como ubicación predeterminada para almacenar archivos generados o requeridos por la aplicación.

EDIT: encontré dos preguntas relacionadas / interesantes:

  • El mejor lugar para guardar información del usuario para aplicaciones de Windows XP y Vista
  • ¿Cuál es la manera de implementar la funcionalidad Guardar / Cargar?

EDIT # 2: Esta es solo una nota para personas como yo que nunca antes habían usado configuraciones. Los ajustes son bastante útiles, pero tuve que hacer un gran trabajo de excavación para descubrir qué estaba sucediendo (viniendo del mundo de Python, no como algo en lo que también estoy acostumbrado). Las cosas se complicaron porque quería guardar diccionarios y aparentemente no se pueden serializar. La configuración también parece almacenarse en 3 archivos diferentes, dependiendo de lo que hagas. Hay un app.config , app.config y settings.setting . Así que aquí hay dos enlaces más que encontré útiles:

  • http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ddeaca86-a093-4997-82c9-01bc0c630138
  • http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/efe370dc-f933-4e55-adf7-3cd8063949b0/

Puede usar la configuración de la aplicación con la suficiente facilidad.

Si no lo ha hecho, simplemente haga clic derecho en el proyecto y elija Propiedades. Selecciona la pestaña Configuración. Asegúrese de elegir “Usuario” para el scope (de lo contrario, la configuración es de solo lectura).

El código para acceder a esto es simple:

 forms.Width = Application1.Properties.Settings.Default.Width; 

Si necesita guardarlo:

 Application1.Properties.Settings.Default.Width = forms.Width; Application1.Properties.Settings.Default.Save(); 

En el ejemplo anterior, Ancho es el nombre de configuración personalizado que define en la pestaña Configuración y Aplicación1 es el Espacio de nombre de su aplicación.

Editar: Respondiendo a más preguntas

Mencionó que quería almacenar objetos de diccionario en la Configuración. Como descubriste, no puedes hacer esto directamente porque los objetos del diccionario no son serializables. Sin embargo, puedes crear tu propio diccionario serializable con bastante facilidad. Paul Welzer tuvo un excelente ejemplo en su blog .

Tienes un par de enlaces que enturbian la situación un poco. Su pregunta original es dónde guardar “Archivos de preferencias del usuario”. Estoy bastante seguro de que la intención de Microsoft con la funcionalidad de Configuración es exactamente eso … almacenar preferencias de diseño de usuario, opciones de diseño, etc. No pretende ser un repository genérico para los datos de una aplicación, aunque podría abusarse fácilmente de esa manera.

Los datos se almacenan en lugares separados por una buena razón. Algunas de las configuraciones son configuraciones de la Aplicación y son de solo lectura. Estos son ajustes que la aplicación necesita para funcionar pero que no son específicos de un usuario (por ejemplo, URI para los recursos de la aplicación o tal vez una tasa de impuestos). Estos se almacenan en la aplicación.config.

La configuración del usuario se almacena en un directorio ofuscado en la carpeta User Document / Settings. Los valores predeterminados se almacenan en app.config (creo, no puedo recordar con certeza) pero cualquier cambio de usuario se almacena en su carpeta personal. Esto es para datos que cambian de usuario a usuario. (Por “usuario” quiero decir usuario de Windows, no usuario de su aplicación).

Espero que esto aclare esto un poco para ti. El sistema es bastante simple. Puede parecer un poco extraño al principio, pero después de unos días de usarlo nunca más tendrás que pensarlo de nuevo … simplemente funciona.

Cuando se ejecuta como no administrador o en Vista, no puede escribir en la carpeta “Archivos de progtwig” (o en cualquier subcarpeta).

La ubicación correcta para almacenar las preferencias del usuario es (reemplace MyCompanyName y MyApplicationName con los nombres correctos, obviamente)

En el disco:

 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\MyCompanyName\\MyApplicationName" 

O en el registro debajo de la clave:

  HKEY_CURRENT_USER\Software\MyCompanyName\MyApplicationName 

Esas ubicaciones son por usuario y funcionan con usuarios que no son administradores, varios usuarios que usan la misma computadora, cambio rápido de usuario, servicios de terminal y todas las otras formas en que las personas pueden interactuar con su software.

Si necesita una ubicación común para todos los usuarios, entonces:

  1. Solo funcionará cuando el usuario se ejecute como administrador
  2. No funcionará de manera confiable en Vista
  3. Debe hacerse cargo de todo usted mismo (como dos usuarios ejecutando la aplicación en la misma computadora al mismo tiempo mediante el cambio rápido de usuario).

y las ubicaciones son:

 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationCommonData) + "\\MyCompanyName\\MyApplicationName" 

O en el registro debajo de la clave:

  HKEY_LOCAL_MACHINE\Software\MyCompanyName\MyApplicationName 

Puede usar almacenamiento aislado. Puede aislar por usuario, ensamblaje y / o dominio.

Introducción al almacenamiento aislado
http://msdn.microsoft.com/en-us/library/3ak841sy(VS.80).aspx

Tipos de aislamiento
http://msdn.microsoft.com/en-us/library/eh5d60e1(VS.80).aspx

la siguiente parece ser la mejor opción:

 Application.UserAppDataPath