WPF / C #: onde devo estar salvando arquivos de preferências do usuário?

Qual é o local recomendado para salvar os arquivos de preferência do usuário? Existe um método recomendado para lidar com as preferências do usuário?

Atualmente eu uso o caminho retornado de typeof(MyLibrary).Assembly.Location como um local padrão para armazenar arquivos gerados ou exigidos pelo aplicativo.

EDIT: eu encontrei duas questões relacionadas / interessantes:

  • Melhor local para salvar informações do usuário em aplicativos do Windows XP e do Vista
  • Qual é o caminho para implementar a funcionalidade Salvar / Carregar?

EDIT # 2: Esta é apenas uma nota para pessoas como eu que nunca usaram configurações antes. As configurações são muito úteis, mas eu tive que fazer um monte de escavações para descobrir o que estava acontecendo (vindo do mundo do Python, não algo que eu sou usado também). As coisas ficaram complicadas porque eu queria salvar dictionarys e aparentemente eles não podem ser serializados. As configurações também parecem ser armazenadas em três arquivos diferentes, dependendo do que você faz. Existe um arquivo app.config , user.config e settings.setting . Então, aqui estão mais dois links que achei úteis:

  • 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/

Você pode usar as configurações do aplicativo com bastante facilidade.

Se você não tiver feito isso antes, clique com o botão direito no projeto e escolha Propriedades. Selecione a guia Configurações. Certifique-se de escolher “Usuário” para o escopo (caso contrário, a configuração é somente leitura).

O código para acessar isso é simples:

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

Se você precisar salvá-lo:

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

No exemplo acima, Largura é o nome da configuração personalizada que você define na guia Configurações e o Aplicativo1 é o Espaço para nome do seu aplicativo.

Editar: respondendo a outras dúvidas

Você mencionou que queria armazenar objects Dicionário nas Configurações. Como você descobriu, não é possível fazer isso diretamente porque os objects do Dicionário não são serializáveis. No entanto, você pode criar seu próprio dictionary serializável facilmente. Paul Welzer teve um excelente exemplo em seu blog .

Você tem um par de links que meio que enlamear a situação um pouco. Sua pergunta original é onde salvar “arquivos de preferência do usuário”. Tenho certeza de que a intenção da Microsoft com a funcionalidade Configurações é exatamente isso … armazenar preferências de aparência do usuário, opções de layout, etc. Não significava como um repository genérico para os dados de um aplicativo, embora pudesse ser facilmente abusado dessa maneira.

Os dados são armazenados em locais separados por um bom motivo. Algumas das configurações são configurações do aplicativo e são somente leitura. Estas são as configurações que o aplicativo precisa para funcionar, mas não é específico para um usuário (por exemplo, URIs para resources do aplicativo ou talvez uma taxa de imposto). Estes são armazenados no app.config.

As configurações do usuário são armazenadas em um diretório ofuscado dentro da pasta Document / Settings do usuário. Os padrões são armazenados em app.config (eu acho, não me lembro por certo fora do topo da minha cabeça), mas as alterações de qualquer usuário são armazenadas em sua pasta pessoal. Isso se destina a dados que mudam de usuário para usuário. (Por “usuário” quero dizer usuário do Windows, não o usuário do seu aplicativo.)

Espero que isso tenha esclarecido um pouco para você. O sistema é bem simples. Pode parecer um pouco estranho no início, mas depois de alguns dias de usá-lo você nunca mais terá que pensar nisso de novo … simplesmente funciona.

Quando executado como não-administrador ou no Vista, você não pode gravar na pasta “Arquivos de programas” (ou em qualquer sub-pasta dele).

O local correto para armazenar a preferência do usuário é (substitua MyCompanyName e MyApplicationName pelos nomes corretos, obviamente)

No disco:

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

Ou no registro sob a chave:

  HKEY_CURRENT_USER\Software\MyCompanyName\MyApplicationName 

Esses locais são por usuário e trabalham com usuários que não são administradores, vários usuários usando o mesmo computador, troca rápida de usuários, serviços de terminal e todas as outras maneiras pelas quais as pessoas podem interagir com seu software.

Se você precisar de um local comum para todos os usuários, então:

  1. Ele só funcionará quando o usuário for executado como administrador
  2. Não funcionará de forma confiável no Vista
  3. Você tem que cuidar de tudo sozinho (como dois usuários executando o aplicativo no mesmo computador ao mesmo tempo através da troca rápida de usuário).

e os locais são:

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

Ou no registro sob a chave:

  HKEY_LOCAL_MACHINE\Software\MyCompanyName\MyApplicationName 

Você pode usar armazenamento isolado. Você pode isolar por usuário, assembly e / ou domínio.

Introdução ao armazenamento isolado
http://msdn.microsoft.com/en-us/library/3ak841sy(VS.80).aspx

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

O seguinte parece ser a melhor opção:

 Application.UserAppDataPath