ConfigurationManager.AppSettings - Jak modyfikować i zapisywać?

81

Pytanie może wydawać się zbyt banalne, a ja robię to samo, co sugerowano w artykułach, ale nie działa to zgodnie z oczekiwaniami. Mam nadzieję, że ktoś wskaże mi właściwy kierunek.

Chciałbym zapisać ustawienia użytkownika na AppSettings.

Po zamknięciu Winform uruchamiam to:

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

Tak więc za pierwszym razem, gdy wpis jeszcze nie istnieje, po prostu go utworzy, w przeciwnym razie zmodyfikuje istniejący wpis. Jednak to nie oszczędza.

1) Co robię źle?

2) Gdzie oczekuję ponownego zapisania ustawień użytkownika dla ustawień aplikacji? Czy znajduje się w folderze Debug czy w folderze C: \ Documents and Settings \ NAZWA UŻYTKOWNIKA \ Ustawienia lokalne \ Dane aplikacji?

Houman
źródło
Skorzystaj z tego: stackoverflow.com/questions/453161/…
Kumar
3
Będzie on znajdować się w folderze, w którym znajduje się plik wykonywalny. Jeśli więc uruchamiasz go z programu Visual Studio w obszarze Debugowanie, będzie on znajdować się w folderze Debug projektu.
Justin
1
Podobnie jak powiedział Justin. Jeśli korzystasz z programu Visual Studio, nadpisze plik .config w folderze Debug projektu za każdym razem, gdy ponownie uruchomisz aplikację.
Welton v3.60
1
geekswithblogs.net/akraus1/archive/2006/01/04/64871.aspx mam nadzieję, że to pomoże :)
Thomas

Odpowiedzi:

25

Być może powinieneś spojrzeć na dodanie pliku ustawień. (np. App.Settings) Utworzenie tego pliku pozwoli Ci wykonać następujące czynności:

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

Oznacza to, że możesz edytować, a następnie zmieniać elementy, w których elementy są silnie wpisane, a co najważniejsze ... nie musisz dotykać żadnego pliku XML przed wdrożeniem!

Rezultatem jest ustawienie kontekstowe aplikacji lub użytkownika.

Zajrzyj do menu „dodaj nowy element” dla pliku ustawień.

Dan
źródło
1
Dodanie pliku Settings.Settings lub użycie istniejącego w Properties / Settings.settings to to samo, prawda? W przypadku korzystania z istniejącego, zrobiłbym coś takiego: Properties.Settings.Default.IntegrateWithPerforce = _integrateCheckBox.Checked; Properties.Settings.Default.Save ();
Houman
1
Całkiem możliwe. Zawsze używałem oddzielnych plików, ponieważ dobrze mi to zrobiło. Jeśli tak jest, właśnie się czegoś dowiedziałem
Dan
Fascynujące, jeśli użyjesz tego ORAZ ConfigurationManager, wszystkie ustawienia i tak znajdą się w pliku App.config, ale w różnych sekcjach. Spodziewałem się 2 różnych plików.
RyanfaeScotland
Nie mogę uwierzyć, że przez cały ten czas przeglądałem plik XML. Wielkie dzięki za tę przydatną wskazówkę!
Smitty-Werben-Jager-Manjenson
80

Wiem, że się spóźniłem :) Ale tak to robię:

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

Więcej informacji można znaleźć w witrynie MSDN

Wahid Bitar
źródło
3
Jednym z głównych punktów, na które należy zwrócić uwagę w powyższym, jest to, że jeśli uruchamiasz to z debugera (w programie Visual Studio), plik app.config zostanie nadpisany za każdym razem, gdy tworzysz. Najlepszym sposobem na przetestowanie tego jest zbudowanie aplikacji, a następnie przejście do katalogu wyjściowego i uruchomienie z niego pliku wykonywalnego. --- z vbcity.com/forums/t/152772.aspx
yu yang Jian
69

O tym, jak zmienić wartości w sekcji appSettings w pliku app.config:

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

wykonuje pracę.

Oczywiście lepszą praktyką jest lekcja ustawień, ale zależy to od tego, czego szukasz.

Marek
źródło
4
Po obejrzeniu trzech pomysłów modyfikacji kajillion AppSettings tutaj i za granicą, jest to najprostszy / najlepszy i (co najważniejsze) działa nawet, jeśli użytkownik zniszczy węzeł <appSettings>
downwitch
39

Wolę <appSettings>do <customUserSetting>sekcji. O wiele łatwiej jest czytać ORAZ pisać za pomocą (Web) ConfigurationManager. ConfigurationSection, ConfigurationElement i ConfigurationElementCollection wymagają wyprowadzenia niestandardowych klas i zaimplementowania niestandardowych właściwości ConfigurationProperty. O wiele za dużo dla zwykłych zwykłych śmiertelników IMO.

Oto przykład czytania i pisania w 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);

Przed:

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

Po:

<appSettings>
  <add key="SomeKey" value="newValue" />
</appSettings>
Tom Wilson
źródło
23

ponieważ podstawowe pytanie dotyczy formularzy wygrywających, tutaj jest rozwiązanie: (Właśnie zmieniłem kod przez user1032413 na rflect windowsForms ustawienia) jeśli jest to nowy klucz:

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

jeśli klucz już istnieje:

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["Key"].Value="Value";
config.Save(ConfigurationSaveMode.Modified);
Omid S.
źródło
8

Spróbuj dodać to po zapisaniu połączenia.

ConfigurationManager.RefreshSection( "appSettings" );
Justin
źródło
1
Jest to szczególnie ważne, jeśli piszesz, a następnie czytasz w tej samej aplikacji w krótkich odstępach czasu.
Trevor
6

Pamiętaj, że ConfigurationManager używa tylko jednego pliku app.config - takiego, który jest w projekcie startowym.

Jeśli umieścisz plik app.config w rozwiązaniu A i utworzysz odniesienie do niego z innego rozwiązania B, to jeśli uruchomisz B, plik app.config z A zostanie zignorowany.

Na przykład projekt testu jednostkowego powinien mieć własny plik app.config.

podwójna pętla
źródło
2

Myślę, że problem polega na tym, że w Visual Studio debugowania nie używaj normalnego exeName.

używa indtead „NameApplication” .host.exe

więc nazwa pliku konfiguracyjnego to „NameApplication” .host.exe.config, a nie „NameApplication” .exe.config

a po zamknięciu aplikacji - wraca do pliku app.config

więc jeśli zaznaczysz zły plik lub zaznaczysz zły czas, zobaczysz, że nic się nie zmieniło.

chmouel kalifa
źródło
-1

Możesz to zmienić ręcznie:

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
źródło