ConfigurationManager.AppSettings - Як змінити та зберегти?


81

Це може здатися занадто тривіальним, щоб запитати, і я роблю те саме, що пропонувалось у статтях, проте це працює не так, як очікувалося. Сподіваюся, хтось може вказати мені правильний напрямок.

Я хотів би зберегти налаштування користувача в AppSettings.

Після закриття Winform я запускаю це:

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);

Отже, перший раз, коли запис ще не існує, він просто створив би його, інакше змінив би існуючий запис. Однак це не рятує.

1) Що я роблю не так?

2) Де я очікую, що користувацькі налаштування для налаштувань програми будуть збережені знову? Це в папці Налагодження або в папці C: \ Documents and Settings \ USERNAME \ Local Settings \ Application Data?


Перейдіть сюди: stackoverflow.com/questions/453161/…
Кумар,


3
Він буде знаходитись у папці, в якій знаходиться виконуваний файл. Отже, якщо ви запускаєте його з Visual Studio під налагодженням, він буде знаходитись у папці налагодження вашого проекту.
Джастін,

1
Так само, як сказав Джастін. І якщо ви працюєте з Visual Studio, він перезапише файл .config у папці налагодження вашого проекту кожного разу при повторному запуску програми.
Welton v3.60

1
geekswithblogs.net/akraus1/archive/2006/01/04/64871.aspx сподіваюся, що це допоможе :)
Томас

Відповіді:


25

Можливо, варто поглянути на додавання файлу налаштувань. (наприклад, App.Settings) Створення цього файлу дозволить вам зробити наступне:

string mysetting = App.Default.MySetting;
App.Default.MySetting = "my new setting";

Це означає, що ви можете редагувати, а потім змінювати елементи, де елементи сильно набираються, і найкраще за все ... перед розгортанням не потрібно торкатися жодного xml!

Результат - контекстна настройка програми або користувача.

Загляньте в меню "додати новий пункт" для файлу налаштувань.


1
Додавання файлу Settings.Settings або використання наявного у розділі Properties / Settings.settings - це одне і те ж, чи не так? У випадку використання наявного, я б зробив щось подібне: Properties.Settings.Default.IntegrateWithPerforce = _integrateCheckBox.Checked; Properties.Settings.Default.Save ();
Houman,

1
Цілком можливо. Я завжди використовував окремі файли, оскільки це робило мене добре. Якщо це так, я щойно дізнався про щось
Ден

Захоплююче, якщо ви використовуєте це І ConfigurationManager, тоді всі налаштування все одно потрапляють у файл App.config, але в різних розділах. Я очікував 2 різних файли.
RyanfaeScotland

Я не можу повірити, що весь цей час переглядав файл XML. Велике спасибі за цю корисну пораду!
Smitty-Werben-Jager-Manjenson

80

Я знаю, що запізнився :) Але ось як я це роблю:

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");
    }
}

Для отримання додаткової інформації зверніться до MSDN


3
Одним із основних моментів, на який слід звернути увагу вищезазначене, є те, що якщо ви запускаєте це з налагоджувача (у Visual Studio), файл app.config буде перезаписуватися кожного разу під час створення. Найкращий спосіб перевірити це - створити програму, а потім перейти до вихідного каталогу та запустити виконуваний файл звідти. --- від vbcity.com/forums/t/152772.aspx
yu yang Jian

69

Про те, як змінити значення в розділі appSettings у вашому файлі app.config:

config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);

робить роботу.

Звичайно, кращою практикою є клас «Налаштування», але це залежить від того, що вам потрібно.


4
Ознайомившись із трьома ідеями модифікації додатків Kajillion AppSettings тут і за кордоном, це найпростіший / найкращий варіант (і, що найважливіше) працює, навіть якщо користувач знищує вузол <appSettings>
downwitch

39

Віддає перевагу <appSettings>в <customUserSetting>розділ. Читати та писати набагато простіше за допомогою (Web) ConfigurationManager. ConfigurationSection, ConfigurationElement і ConfigurationElementCollection вимагають вивести власні класи та реалізувати власні властивості ConfigurationProperty. Занадто багато для простих повсякденних смертних ІМО.

Ось приклад читання та написання на 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);

До:

<appSettings>
  <add key="SomeKey" value="oldValue" />
</appSettings>

Після:

<appSettings>
  <add key="SomeKey" value="newValue" />
</appSettings>

23

оскільки основне питання стосується форм виграшу, ось рішення: (я щойно змінив код користувачем1032413 на налаштування rflect windowsForms), якщо це новий ключ:

Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings.Add("Key","Value");
config.Save(ConfigurationSaveMode.Modified);

якщо ключ вже існує:

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["Key"].Value="Value";
config.Save(ConfigurationSaveMode.Modified);

8

Спробуйте додати це після збереження дзвінка.

ConfigurationManager.RefreshSection( "appSettings" );

1
Це особливо важливо, якщо ви пишете, а потім читаєте в одній програмі.
Тревор

6

Пам’ятайте, що ConfigurationManager використовує лише одне app.config - одне, яке знаходиться у стартовому проекті.

Якщо ви додасте деяке app.config до рішення A і зробите посилання на нього з іншого рішення B, то якщо ви запустите B, app.config з A буде проігноровано.

Так, наприклад, проект модульного тесту повинен мати власний app.config.


2

Я думаю, проблема полягає в тому, що у візуальній студії налагодження не використовують звичайний exeName.

він використовує замість "NameApplication" .host.exe

отже, ім'я файлу конфігурації - "NameApplication" .host.exe.config, а не "NameApplication" .exe.config

а після закриття програми - вона повертається до спинки app.config

отже, якщо ви перевірите неправильний файл або перевірте не той час, ви побачите, що нічого не змінилося.


-1

Ви можете змінити його вручну:

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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.