Записать значения в файл app.config

Может кто-нибудь, пожалуйста, помогите мне, как я могу установить / сохранить значения в файле app.config с помощью C#, это вообще возможно?

11 ответов

Решение

Если вы используете App.Config для хранения значений в <app Key="" Value="" /> или раздел CustomSections использует класс ConfigurationManager, иначе используйте класс XMLDocument.

Вы можете использовать код, размещенный на CodeProject

Попробуйте следующий код:

    Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
    config.AppSettings.Settings.Add("YourKey", "YourValue");
    config.Save(ConfigurationSaveMode.Minimal);

У меня это сработало:-)

В Framework 4.5 часть ConfigurationSanager AppSettings.Settings["key"] доступна только для чтения, поэтому мне пришлось сначала удалить ключ, а затем добавить его еще раз, используя следующее:

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);

config.AppSettings.Settings.Remove("MySetting");
config.AppSettings.Settings.Add("MySetting", "some value");

config.Save(ConfigurationSaveMode.Modified);

Не волнуйтесь, вы не получите исключения, если попытаетесь удалить ключ, который не существует.

Этот пост дает хороший совет

private static string GetSetting(string key)
{
    return ConfigurationManager.AppSettings[key];
}

private static void SetSetting(string key, string value)
{
    Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    configuration.AppSettings.Settings[key].Value = value;
    configuration.Save(ConfigurationSaveMode.Full, true);
    ConfigurationManager.RefreshSection("appSettings");
}

Как уже упоминалось, вы можете сделать это с ConfigurationManager.AppSettings.Settings, Но: используя Settings[key] = value не будет работать, если ключ не существует.
С помощью Settings.Add(key, value), если ключ уже существует, он присоединит новое значение к его значениям, разделенным запятой, что-то вроде<add key="myKey" value="value1, value2, value3" />

Чтобы избежать этих неожиданных результатов, вы должны обработать два сценария

  • Если запись с данным ключом существует? затем обновите его значение
  • если запись с данным ключом не существует? затем создайте новую запись (ключ, значение)

Код

public static void Set(string key, string value)
{
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

    var entry = config.AppSettings.Settings[key];
    if (entry == null)
        config.AppSettings.Settings.Add(key, value);
    else
        config.AppSettings.Settings[key].Value = value;

    config.Save(ConfigurationSaveMode.Modified);
}

Для получения дополнительной информации о чеке entry == null, проверьте этот пост.
Надеюсь, это кому-нибудь поможет.

Для консольного приложения.NET 4.0 ни один из них не работал для меня. Поэтому я использовал следующее ниже, и это сработало:

private static void UpdateSetting(string key, string value)
{
    Configuration configuration = ConfigurationManager.
        OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
    configuration.AppSettings.Settings[key].Value = value;
    configuration.Save();

    ConfigurationManager.RefreshSection("appSettings");
}
string filePath = System.IO.Path.GetFullPath("settings.app.config");

var map = new ExeConfigurationFileMap { ExeConfigFilename = filePath };
try
{
    // Open App.Config of executable
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

    // Add an Application Setting if not exist

        config.AppSettings.Settings.Add("key1", "value1");
        config.AppSettings.Settings.Add("key2", "value2");

    // Save the changes in App.config file.
    config.Save(ConfigurationSaveMode.Modified);

    // Force a reload of a changed section.
    ConfigurationManager.RefreshSection("appSettings");
}
catch (ConfigurationErrorsException ex)
{
    if (ex.BareMessage == "Root element is missing.")
    {
        File.Delete(filePath);
        return;
    }
    MessageBox.Show(ex.Message);
}

Попробуйте следующее:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);            
config.AppSettings.Settings[key].Value = value;
config.Save();
ConfigurationManager.RefreshSection("appSettings");

Да, вы можете - см. ConfigurationManager

Класс ConfigurationManager включает члены, позволяющие выполнять следующие задачи:

  • Чтение и запись файлов конфигурации в целом.

Научитесь пользоваться документами, они должны стать вашим первым портом захода на такой вопрос.

//if you want change
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
config.AppSettings.Settings[key].Value = value;

//if you want add
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
config.AppSettings.Settings.Add("key", value);

Я боролся с этим некоторое время и, наконец, понял это самостоятельно. В то время я не нашел никакой помощи, но хотел поделиться своим подходом. Я делал это несколько раз и использовал метод, отличный от того, что указано выше. Не уверен, насколько это надежно, но это сработало для меня.

Допустим, у вас есть текстовое поле с именем «txtName», кнопка с именем «btnSave», и вы хотите сохранить имя, чтобы при следующем запуске программы введенное вами имя отображалось в этом текстовом поле.

  1. Перейдите в «Проект»> «Свойства»> «Настройки» и создайте настройку —
  • имя = "Имя"
  • тип = "строка"
  • область = "пользователь"
  • значение, которое вы можете оставить пустым.

Сохраните файл настроек.

  1. Перейдите в свою форму, где есть текстовое поле и кнопка. Дважды щелкните кнопку и введите этот код;
          //This tells your program to save the value you have to the properties file (app.config);
    //"Name" here is the name you used in your settings file above.
    Properties.Settings.Default.Name = txtName.txt;
    //This tells your program to make these settings permanent, otherwise they are only
    //saved for the current session
    Properties.Settings.Default.Save();
  1. Перейдите к своей функции form_load и добавьте это туда;
          //This tells your program to load the setting you saved above to the textbox
    txtName.txt = Properties.Settings.Default.Name;
  1. Отладьте свое приложение, и вы должны увидеть имя, которое вы ввели.
  2. Проверьте каталог отладки вашего приложения, и вы должны увидеть файл .config с именем вашей программы. Откройте его в текстовом редакторе, и вы увидите свои настройки.

Заметки -

  • «Имя» относится к фактическому названию созданной вами настройки.
  • Ваша программа позаботится о создании фактического XML-файла, вам не нужно об этом беспокоиться.
Другие вопросы по тегам