How to use .NET configuration files (app.config, settings.settings) to save and restore all application data?

17,090

Solution 1

Since I did not receive any other answers and was not happy with my previous solution, I asked the question again, did some more research, and was able to come up with a better answer. See How to load a separate Application Settings file dynamically and merge with current settings? for the code and explanation.

Solution 2

Since you app.config file is a simple xml file you can load it into an XDocument:

string path = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
XDocument doc = XDocument.Load(path);
//Do your modifications to section x
doc.Save(path);
ConfigurationManager.RefreshSection("x");

I corrected the XDocument.Load() code according to @Pat's comment

Solution 3

It is best practice to NOT write to the app.config but use the settings file for saving user settings that are modified. The app.config and web.config should only be used for read only values.

Solution 4

I do not think overriding the entire config file is a good idea. Some of the settings in this file might contain settings to be processed really early, before any of your code had a chance to do anything i.e. the ones related to the startup of .NET CLR.

Share:
17,090
Pat
Author by

Pat

Previously a "Software Engineer" at a small electronics design shop, now a mostly JS and python dev interested in learning, doing, and teaching.

Updated on June 17, 2022

Comments

  • Pat
    Pat almost 2 years

    Although there are a lot of posts about .net config files, I believe that my requirements do not allow for any of the solutions proposed (or I don't understand the process enough to make it work for me).

    The situation is that I have a Windows Forms application (could just as well be another app) which binds certain user input fields (e.g. IP Address), as well as form properties (window size, etc) to application settings (in the Properties->Settings area). From what I understand, these settings are the same as those represented in my project's app.config file, so I should be able to use the System.Configuration.ConfigurationManager class to manipulate those settings.

    What I want to do is to allow the user to export and import all of the saved settings. Rather than doing serialization of some custom object or working with INI files, I thought it would be easier to just save and replace the config file that the application uses.

    It is relatively easy to save the current settings to a specified file:

    internal static void Export(string settingsFilePath)
    {
        var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
        config.SaveAs(settingsFilePath);
    }
    

    However, restoring a config file to overwrite the current settings is proving difficult. It seems like I can open a configuration file like so

    var newConfig = ConfigurationManager.OpenExeConfiguration(settingsFilePath)
    

    but I don't see how to completely replace all of the settings in the current config with those of the imported file. [Edit: This overload is supposed to receive the path of the .exe, not the .config file. Opening an exe file in this manner will possibly throw a ConfigurationErrorsException if the calling code doesn't reference the same assemblies in the config file.]

    Perhaps I only need to use the methods outlined in other posts to replace only a section of the config, and not the whole thing, but I don't see how that would work at this point.

    Any ideas? Am I going down the right track, or should I just use INI files (or something else)?

  • Pat
    Pat over 14 years
    It seems that you are right about not manipulating the entire file: In memory, at least, there are many more sections than just the "appSettings" one that I think I am interested in. To see what I mean, try var currentConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserL‌​evel.PerUserRoamingA‌​ndLocal); currentConfig.Dump(); in LINQPad.
  • Pat
    Pat over 14 years
    OK, but how is that done? I am already using the settings file to persist user input between runs of the application, but how can I save and restore that information as a separate file (import/export)?
  • Kenoyer130
    Kenoyer130 over 14 years
    As the below post from Manu, just think of it as an XML file.
  • Pat
    Pat over 14 years
    Thanks for the recommendation, but the path you specified is not the correct one for changing user settings. Also, in case anyone else wants to try this, Load is a static method of the XDocument class, so the syntax is var doc = XDocument.Load(path);. I'll continue to pursue reading and replacing sections of the XML file to see if this method works, but no luck yet.
  • Manu
    Manu over 14 years
    The path should point to your App.config where I thought the section you want to manipulate is.
  • Pat
    Pat about 14 years
    I would like to know why someone considers this a bad answer as well as have somebody produce a "good" answer. All I have to say is that this code works and there have been no other working solutions presented.
  • Pat
    Pat about 14 years
    Again, how is that done? My understanding is that the settings "file" is really just app.config, seeing as that is where the settings are stored. Clarifications?
  • Pat
    Pat about 14 years
    Now that I understand this all a bit better, I know that it isn't app.config that I wanted to modify. I am using Application Settings through the Settings Designer and binding them to properties in controls on my GUI. These properties are per-user, so they are stored in user.config (which is generated when the program executes - it's not in the VS solution).
  • Pat
    Pat about 14 years
    I've discovered that it isn't the "appSettings" value that I wanted to change, but the "userSettings" value. Specifically, it's the child node <MyApplication.Properties.Settings>.
  • Pat
    Pat about 14 years
    By the way, this solution does not manipulate the app.config file. It modifies the in-memory version of user.config which is transferred to file on application close.