c# - example - ConfigurationManager.AppSettings-¿Cómo modificar y guardar?
modificar app.config en tiempo de ejecucion c# (10)
Creo que el problema es que en el estudio visual de depuración no utilices el exeName normal.
usa indtead "NameApplication" .host.exe
por lo que el nombre del archivo de configuración es "NameApplication" .host.exe.config y no "NameApplication" .exe.config
y después de cerrar la aplicación, regresa a la parte posterior de la aplicación.config
entonces, si marca el archivo incorrecto o lo comprueba en el momento equivocado, verá que nada ha cambiado.
Puede sonar demasiado trivial para preguntar y yo hago lo mismo que se sugiere en los artículos, pero no funciona como se esperaba. Espero que alguien pueda señalarme la dirección correcta.
Me gustaría guardar la configuración de los usuarios por AppSettings.
Una vez que el Winform está cerrado, disparo esto:
conf.Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (ConfigurationManager.AppSettings["IntegrateWithPerforce"] != null)
ConfigurationManager.AppSettings["IntegrateWithPerforce"] =
e.Payload.IntegrateCheckBox.ToString();
else
config.AppSettings.Settings.Add("IntegrateWithPerforce",
e.Payload.IntegrateCheckBox.ToString());
config.Save(ConfigurationSaveMode.Modified);
Por lo tanto, la primera vez cuando la entrada aún no existe, simplemente la crearía; de lo contrario, modificaría la entrada existente. Sin embargo, esto no guarda.
1) ¿Qué estoy haciendo mal?
2) ¿Dónde estoy esperando que la configuración del usuario para la configuración de la aplicación se guarde de nuevo? ¿Está en la carpeta Depurar o en la carpeta C: / Documents and Settings / NOMBRE DE USUARIO / Configuración local / Datos de la aplicación?
Intenta agregar esto después de guardar la llamada.
ConfigurationManager.RefreshSection( "appSettings" );
Prefiere la <appSettings>
a <customUserSetting>
. Es mucho más fácil leer Y escribir con ConfigurationManager (Web). ConfigurationSection, ConfigurationElement y ConfigurationElementCollection requieren derivar clases personalizadas e implementar propiedades personalizadas de ConfigurationProperty. Demasiado para los simples mortales todos los días IMO.
Aquí hay un ejemplo de lectura y escritura en web.config:
using System.Web.Configuration;
using System.Configuration;
Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
string oldValue = config.AppSettings.Settings["SomeKey"].Value;
config.AppSettings.Settings["SomeKey"].Value = "NewValue";
config.Save(ConfigurationSaveMode.Modified);
Antes de:
<appSettings>
<add key="SomeKey" value="oldValue" />
</appSettings>
Después:
<appSettings>
<add key="SomeKey" value="newValue" />
</appSettings>
Puedes cambiarlo manualmente:
private void UpdateConfigFile(string appConfigPath, string key, string value)
{
var appConfigContent = File.ReadAllText(appConfigPath);
var searchedString = $"<add key=/"{key}/" value=/"";
var index = appConfigContent.IndexOf(searchedString) + searchedString.Length;
var currentValue = appConfigContent.Substring(index, appConfigContent.IndexOf("/"", index) - index);
var newContent = appConfigContent.Replace($"{searchedString}{currentValue}/"", $"{searchedString}{newValue}/"");
File.WriteAllText(appConfigPath, newContent);
}
Recuerde que ConfigurationManager usa solo un app.config, uno que está en el proyecto de inicio.
Si coloca alguna app.config en una solución A y la hace referencia desde otra solución B, si ejecuta B, app.config de A se ignorará.
Entonces, por ejemplo, el proyecto de prueba unitaria debe tener su propia aplicación .config.
Sé que llego tarde :) Pero así es como lo hago:
public static void AddOrUpdateAppSettings(string key, string value)
{
try
{
var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var settings = configFile.AppSettings.Settings;
if (settings[key] == null)
{
settings.Add(key, value);
}
else
{
settings[key].Value = value;
}
configFile.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
}
catch (ConfigurationErrorsException)
{
Console.WriteLine("Error writing app settings");
}
}
Para obtener más información, consulte MSDN
Sobre cómo cambiar los valores en la sección appSettings en su archivo app.config:
config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);
hace el trabajo.
Por supuesto, una mejor práctica es la clase de Configuración, pero depende de lo que está buscando.
Tal vez deberías mirar agregar un archivo de configuración. (por ejemplo, App.Settings) Crear este archivo le permitirá hacer lo siguiente:
string mysetting = App.Default.MySetting;
App.Default.MySetting = "my new setting";
Esto significa que puede editar y luego cambiar elementos, donde los elementos están fuertemente tipados, y lo mejor de todo ... ¡no tiene que tocar ningún xml antes de implementarlo!
El resultado es una configuración contextual de Aplicación o Usuario.
Eche un vistazo al menú "agregar nuevo elemento" para el archivo de configuración.
como la pregunta básica es sobre formas ganadoras, aquí está la solución: (Acabo de cambiar el código por user1032413 para modificar la configuración de WindowsForms) si es una clave nueva:
Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath);
config.AppSettings.Settings.Add("Key","Value");
config.Save(ConfigurationSaveMode.Modified);
si la clave ya existe:
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
config.AppSettings.Settings["Key"].Value="Value";
config.Save(ConfigurationSaveMode.Modified);
public void ApplySettings(string key, string value)
{
var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var settings = configFile.AppSettings.Settings;
if (settings[key] == null)
{
settings.Add(key, value);
}
else
{
settings[key].Value = value;
}
configFile.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
}