ConfigurationManager.AppSettings - ¿Cómo modificar y guardar?

81

Puede sonar demasiado trivial para preguntar y 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 usuario por AppSettings.

Una vez que el Winform está cerrado, activo 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);

Entonces, la primera vez que la entrada aún no existe, simplemente la crearía, de lo contrario, modificaría la entrada existente. Sin embargo, esto no salva.

1) ¿Qué estoy haciendo mal?

2) ¿Dónde espero que se guarden de nuevo los ajustes de usuario para la configuración de la aplicación? ¿Está en la carpeta Debug o en la carpeta C: \ Documents and Settings \ USERNAME \ Local Settings \ Application Data?

Houman
fuente
3
Estará en la carpeta en la que se encuentra el ejecutable. Por lo tanto, si lo ejecuta desde Visual Studio en Debug, estará en la carpeta Debug de su proyecto.
Justin
1
Lo mismo ocurre con lo que dijo Justin. Y si está ejecutando desde Visual Studio, SOBRESCRIBIRÁ el archivo .config en la carpeta Debug de su proyecto cada vez que vuelva a ejecutar su aplicación.
Welton v3.60

Respuestas:

25

Quizás debería considerar agregar un archivo de configuración. (por ejemplo, App.Settings) La creación de 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 implementar!

El resultado es una configuración contextual de Aplicación o Usuario.

Eche un vistazo en el menú "agregar nuevo elemento" para el archivo de configuración.

Dan
fuente
1
Agregar un archivo Settings.Settings o usar el existente en Properties / Settings.settings es lo mismo, ¿verdad? En caso de usar el existente, haría algo como esto: Properties.Settings.Default.IntegrateWithPerforce = _integrateCheckBox.Checked; Properties.Settings.Default.Save ();
Houman
1
Muy posiblemente. Siempre he usado archivos separados ya que eso me ha funcionado bien. Si ese es el caso, acabo de aprender algo
Dan
Fascinante, si usa esto Y el ConfigurationManager, todas las configuraciones terminan en el archivo App.config de todos modos, pero en diferentes secciones. Esperaba 2 archivos diferentes.
RyanfaeScotland
No puedo creer que haya estado repasando un archivo XML todo este tiempo. ¡Muchas gracias por este útil consejo!
Smitty-Werben-Jager-Manjenson
78

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

Wahid Bitar
fuente
3
Un punto importante a tener en cuenta con lo anterior es que si está ejecutando esto desde el depurador (dentro de Visual Studio), el archivo app.config se sobrescribirá cada vez que compile. La mejor manera de probar esto es compilar su aplicación y luego navegar al directorio de salida e iniciar su ejecutable desde allí. --- de vbcity.com/forums/t/152772.aspx
yu yang Jian
69

Sobre cómo cambiar 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 busques.

Marek
fuente
4
Después de ver tres ideas de modificaciones de Kajillion AppSettings aquí y en el extranjero, esta es la más simple / mejor, y (crucialmente) funciona incluso si el usuario destruye el nodo <appSettings>
downwitch
39

Prefiero <appSettings>a <customUserSetting>la sección. Es mucho más fácil leer Y escribir con ConfigurationManager (Web). ConfigurationSection, ConfigurationElement y ConfigurationElementCollection requieren que derive clases personalizadas e implemente propiedades de ConfigurationProperty personalizadas. Demasiado para los simples mortales cotidianos, en mi opinión.

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>
Tom Wilson
fuente
23

como la pregunta básica es sobre formularios win, aquí está la solución: (acabo de cambiar el código del usuario 1032413 para reflejar la configuración de windowsForms) si es una nueva clave:

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);
Omid S.
fuente
8

Intente agregar esto después de guardar la llamada.

ConfigurationManager.RefreshSection( "appSettings" );
Justin
fuente
1
Esto es particularmente importante si está escribiendo y luego leyendo en la misma aplicación Estableciéndose en una sucesión rápida.
Trevor
6

Recuerde que ConfigurationManager usa solo un app.config, uno que está en el proyecto de inicio.

Si coloca algún app.config en una solución A y hace una referencia a él desde otra solución B, entonces si ejecuta B, se ignorará app.config de A.

Entonces, por ejemplo, el proyecto de prueba unitaria debería tener su propia app.config.

doble circuito
fuente
2

Creo que el problema es que en el debug Visual Studio no se usa el exeName normal.

utiliza en lugar de "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, vuelve a la aplicación posterior.

por lo tanto, si comprueba el archivo incorrecto o la hora incorrecta, verá que no ha cambiado nada.

chmouel kalifa
fuente
0

Puede 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);
}
GalUnicode
fuente