O que eu quero alcançar é muito simples: eu tenho um aplicativo Windows Forms (.NET 3.5) que usa um caminho para ler informações. Esse caminho pode ser modificado pelo usuário, usando o formulário de opções que forneço.
Agora, quero salvar o valor do caminho em um arquivo para uso posterior. Essa seria uma das muitas configurações salvas neste arquivo. Este arquivo fica diretamente na pasta do aplicativo.
Entendo que três opções estão disponíveis:
- Arquivo ConfigurationSettings (appname.exe.config)
- Registro
- Arquivo XML Customizado
Eu li que o arquivo de configuração do .NET não está previsto para salvar os valores novamente. Quanto ao registro, gostaria de ficar o mais longe possível.
Isso significa que devo usar um arquivo XML personalizado para salvar as configurações?
Nesse caso, eu gostaria de ver um exemplo de código disso (C #).
Já vi outras discussões sobre esse assunto, mas ainda não está claro para mim.
fonte
Respostas:
Se você trabalha com o Visual Studio, é muito fácil obter configurações persistentes. Clique com o botão direito do mouse no projeto no Solution Explorer e escolha Propriedades. Selecione a guia Configurações e clique no hiperlink se as configurações não existirem.
Use a guia Configurações para criar configurações do aplicativo. O Visual Studio cria os arquivos
Settings.settings
eSettings.Designer.settings
que contêm a classe singletonSettings
herdada de ApplicationSettingsBase . Você pode acessar esta classe a partir do seu código para ler / gravar as configurações do aplicativo:Essa técnica é aplicável tanto ao console, Windows Forms e outros tipos de projeto.
Observe que você precisa definir a propriedade do escopo das suas configurações. Se você selecionar o escopo do aplicativo, Settings.Default. <Sua propriedade> será somente leitura.
Referência: Como: Escrever configurações do usuário em tempo de execução com C # - Microsoft Docs
fonte
Settings.Default.SomeProperty = 'value'; Settings.Default.Save();
Funciona como um encanto. Ou é porque eu tenho configurações de usuário?Settings.Default.Save()
não faz nada está incorreta. Como @aku afirma na resposta, as configurações do escopo do aplicativo são somente leitura: save é ineficaz para eles. Use esse PortableSettingsProvider personalizado para salvar as configurações do escopo do usuário no app.config localizado onde o exe está, em vez daquele na pasta AppData do usuário. Não, geralmente não é bom, mas eu o uso durante o desenvolvimento para usar as mesmas configurações de compilar para compilar (sem ele, elas vão para novas pastas de usuário exclusivas a cada compilação).Se você está planejando salvar em um arquivo no mesmo diretório que o executável, aqui está uma boa solução que usa o formato JSON :
fonte
DEFAULT_FILENAME
, basta ligarsettings.Save(theFileToSaveTo)
; Sendo todas as letras maiúsculas,DEFAULT_FILENAME
é suposto ser uma constante . Se você deseja uma propriedade de leitura e gravação, faça uma e faça com que o construtor a configureDEFAULT_FILENAME
. Em seguida, faça com que o valor padrão do argumento sejanull
, teste para isso e use sua propriedade como o valor padrão. É um pouco mais digitado, mas oferece uma interface mais padrão.System.Web.Extensions.dll
se ainda não o fez.O registro é proibido. Você não tem certeza se o usuário que usa seu aplicativo tem direitos suficientes para gravar no registro.
Você pode usar o
app.config
arquivo para salvar as configurações no nível do aplicativo (que são iguais para cada usuário que usa seu aplicativo).Eu armazenaria configurações específicas do usuário em um arquivo XML, que seria salvo no armazenamento isolado ou no diretório SpecialFolder.ApplicationData .
Além disso, a partir do .NET 2.0, é possível armazenar valores novamente no
app.config
arquivo.fonte
A
ApplicationSettings
classe não suporta salvar configurações no arquivo app.config . Isso é muito por design; os aplicativos executados com uma conta de usuário devidamente protegida (pense no Vista UAC) não têm acesso de gravação à pasta de instalação do programa.Você pode combater o sistema com a
ConfigurationManager
classe. Mas a solução trivial é entrar no designer de Configurações e alterar o escopo da configuração para Usuário. Se isso causar dificuldades (por exemplo, a configuração é relevante para todos os usuários), você deve colocar o recurso Opções em um programa separado para poder solicitar o prompt de elevação de privilégios. Ou renuncie usando uma configuração.fonte
O argumento de registro / configurationSettings / XML ainda parece muito ativo. Eu usei todos eles, à medida que a tecnologia avançava, mas o meu favorito é baseado no sistema da Threed combinado com o armazenamento isolado .
O exemplo a seguir permite o armazenamento de objetos nomeados propriedades em um arquivo no armazenamento isolado. Tal como:
As propriedades podem ser recuperadas usando:
É apenas uma amostra, não sugestiva de boas práticas.
fonte
Eu queria compartilhar uma biblioteca que construí para isso. É uma pequena biblioteca, mas uma grande melhoria (IMHO) sobre arquivos .settings.
A biblioteca é chamada Jot (GitHub) . Aqui está um artigo antigo do The Code Project que escrevi sobre isso.
Veja como você o usaria para acompanhar o tamanho e a localização de uma janela:
O benefício comparado aos arquivos .settings: há consideravelmente menos código e é muito menos suscetível a erros, pois você só precisa mencionar cada propriedade uma vez .
Com os arquivos de configurações, é necessário mencionar cada propriedade cinco vezes: uma vez quando você cria explicitamente a propriedade e outras quatro vezes no código que copia os valores para frente e para trás.
Armazenamento, serialização, etc. são completamente configuráveis. Quando os objetos de destino são criados por um contêiner de IoC , você pode [conectá-lo] [] para que ele aplique o rastreamento automaticamente a todos os objetos que resolve, para que tudo o que você precise fazer para tornar uma propriedade persistente seja clicar em [Rastreável] atributo nele.
É altamente configurável e você pode configurar: - quando os dados são persistentes e aplicados globalmente ou para cada objeto rastreado - como são serializados - onde são armazenados (por exemplo, arquivo, banco de dados, armazenamento online, isolado, registro) - regras que podem cancelar a aplicação / dados persistentes para uma propriedade
Confie em mim, a biblioteca é de primeira qualidade!
fonte
Uma maneira simples é usar um objeto de dados de configuração, salvá-lo como um arquivo XML com o nome do aplicativo na pasta local e, na inicialização, lê-lo novamente.
Aqui está um exemplo para armazenar a posição e o tamanho de um formulário.
O objeto de dados de configuração é fortemente digitado e fácil de usar:
Uma classe de gerente para salvar e carregar:
Agora você pode criar uma instância e usar os eventos load e close do seu formulário:
E o arquivo XML produzido também é legível:
fonte
c:\program files\my application
pasta; portanto, o salvamento das configurações gera um erro. Estou tentando salvar o arquivo xml no AppData, mas apenas me perguntei se havia uma maneira óbvia de contornar esse problema, pois essa abordagem parece ter funcionado para você.Não gosto da solução proposta de usar
web.config
orapp.config
. Tente ler seu próprio XML. Dê uma olhada em Arquivos de configurações XML - Não há mais web.config .fonte
Outras opções, em vez de usar um arquivo XML personalizado, podemos usar um formato de arquivo mais amigável: arquivo JSON ou YAML.
Você pode armazenar seu arquivo de configurações em várias pastas especiais (para todos os usuários e por usuário), conforme listado aqui Environment.SpecialFolder Enumeração e vários arquivos (somente leitura padrão, por função, por usuário, etc.)
Se você optar por usar várias configurações, poderá mesclar essas configurações: Por exemplo, mesclando configurações para o padrão + BasicUser + AdminUser. Você pode usar suas próprias regras: a última substitui o valor, etc.
fonte
"Isso significa que devo usar um arquivo XML personalizado para salvar as configurações?" Não, não necessariamente. Usamos o SharpConfig para essas operações.
Por exemplo, se um arquivo de configuração é assim
Podemos recuperar valores como este
É compatível com o .NET 2.0 e superior. Podemos criar arquivos de configuração em tempo real e salvá-los mais tarde.
Fonte: http://sharpconfig.net/
GitHub: https://github.com/cemdervis/SharpConfig
fonte
Pelo que sei, o .NET suporta configurações persistentes usando o recurso de configurações de aplicativos interno:
fonte
Às vezes, você deseja se livrar dessas configurações mantidas no arquivo tradicional web.config ou app.config. Você deseja um controle mais refinado sobre a implantação de suas entradas de configurações e o design de dados separados. Ou o requisito é permitir a adição de novas entradas no tempo de execução.
Eu posso imaginar duas boas opções:
A vantagem da versão fortemente tipada são os nomes e valores das configurações fortemente tipadas. Não há risco de misturar nomes ou tipos de dados. A desvantagem é que mais configurações precisam ser codificadas, não podem ser adicionadas em tempo de execução.
Com a versão orientada a objeto, a vantagem é que novas configurações podem ser adicionadas em tempo de execução. Mas você não possui nomes e valores fortemente digitados. Deve ter cuidado com os identificadores de sequência. É necessário conhecer o tipo de dados salvo anteriormente ao obter um valor.
Você pode encontrar o código de ambas as implementações totalmente funcionais AQUI .
fonte
Sim, é possível salvar a configuração - mas depende muito da maneira como você escolhe fazê-lo. Deixe-me descrever as diferenças técnicas para que você possa entender as opções que possui:
Primeiro, você precisa distinguir se deseja usar applicationSettings ou AppSettings no seu arquivo
*.exe.config
(também conhecido comoApp.config
Visual Studio) - há diferenças fundamentais, sendo descritas aqui .Ambos oferecem maneiras diferentes de salvar alterações:
config.Save(ConfigurationSaveMode.Modified);
, onde a configuração é definida comoconfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
).Properties.Settings.Default.Save();
), elas serão gravadas por usuário, armazenadas em um local especial (por exemploC:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw\1.0.0.0
). Como Hans Passant mencionou em sua resposta, isso ocorre porque um usuário geralmente tem direitos restritos aos Arquivos de Programas e não pode gravar nele sem chamar o prompt do UAC. Uma desvantagem é que, se você adicionar chaves de configuração no futuro, precisará sincronizá-las com todos os perfis de usuário.Nota: Conforme mencionado na pergunta, existe uma terceira opção: se você tratar o arquivo de configuração como documento XML, poderá carregá-lo, modificá-lo e salvá-lo usando a
System.Xml.Linq.XDocument
classe Não é necessário usar um arquivo XML personalizado, você pode ler o arquivo de configuração existente; para consultar elementos, você pode até usar consultas Linq. Dei um exemplo aqui , confira a funçãoGetApplicationSetting
na resposta.Se você precisar de criptografia para proteger seus valores, confira esta resposta.
fonte
fonte