Chociaż istnieje wiele postów dotyczących plików konfiguracyjnych .net, uważam, że moje wymagania nie pozwalają na żadne z proponowanych rozwiązań (lub nie rozumiem wystarczająco dużo procesu, aby to działało dla mnie).Jak używać plików konfiguracyjnych .NET (app.config, settings.settings) do zapisywania i przywracania wszystkich danych aplikacji?
Sytuacja jest taka, że mam aplikację Windows Forms (równie dobrze mogłaby to być inna aplikacja), która wiąże określone pola wprowadzania użytkowników (np. Adres IP), a także właściwości formularza (rozmiar okna, itp.) Z ustawieniami aplikacji (w obszarze Właściwości-> Ustawienia). Z tego co rozumiem, te ustawienia są takie same jak te przedstawione w pliku app.config mojego projektu, więc powinienem móc używać klasy System.Configuration.ConfigurationManager do manipulowania tymi ustawieniami.
Co chcę zrobić, to pozwolić użytkownikowi na eksport i import wszystkich zapisanych ustawień. Zamiast robienia serializacji jakiegoś niestandardowego obiektu lub pracy z plikami INI, pomyślałem, że łatwiej będzie po prostu zapisać i zastąpić plik konfiguracyjny, z którego korzysta aplikacja.
Jest to stosunkowo łatwe, można zapisać bieżące ustawienia w określonym pliku:
internal static void Export(string settingsFilePath)
{
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
config.SaveAs(settingsFilePath);
}
Jednak przywrócenie plik konfiguracyjny, aby zastąpić bieżące ustawienia okazuje się trudne.
Wydaje się, że mogę otworzyć plik konfiguracyjny Podobnie jak
var newConfig = ConfigurationManager.OpenExeConfiguration(settingsFilePath)
ale nie widzę sposobu, aby całkowicie zastąpić wszystkie ustawienia w bieżącej konfiguracji z tych z importowanego pliku.
[Edytuj: To przeciążenie ma otrzymać ścieżkę pliku .exe, a nie pliku .config. Otwarcie pliku exe w ten sposób spowoduje prawdopodobnie wyjątek ConfigurationErrorsException, jeśli kod wywołujący nie odwołuje się do tych samych zestawów w pliku konfiguracyjnym.]
Być może muszę użyć tylko metod opisanych w other posts, aby zastąpić tylko część konfiguracja, a nie całość, ale nie widzę, jak to by działało w tym momencie.
Wszelkie pomysły? Czy podążam właściwą ścieżką, czy powinienem po prostu użyć plików INI (lub czegoś innego)?
Wydaje się, że masz rację o nie manipulowanie cały plik. W pamięci, co najmniej, istnieje wiele więcej sekcji niż tylko jednym „appSettings”, który myślę, że jestem zainteresowany Aby zobaczyć, co mam na myśli, spróbuj var currentConfig = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.PerUserRoamingAndLocal); currentConfig.Dump(); w LINQPad. – Pat
Odkryłem, że nie jest to wartość "appSettings", którą chciałem zmienić, ale wartość "userSettings". W szczególności jest to węzeł podrzędny. –
Pat