Search code examples
c#xml.net-4.0settingsrapid-prototyping

How to use the read/writeable local XML settings?


I found something similar to what I need here: http://www.codeproject.com/KB/cs/PropertiesSettings.aspx But it does not quite do it for me. The user settings are stored in some far away location such as C:\documents and settings\[username]\local settings\application data\[your application], but I do not have access to these folders and I cannot copy the settings file from one computer to another, or to delete the file altogether. Also, it would be super-convenient to have the settings xml file right next to the app, and to copy/ship both. This is used for demo-ware (which is a legitimate type of coding task) and will be used by non-technical people in the field. I need to make this quickly, so I need to reuse some existing library and not write my own. I need to make it easy to use and be portable. The last thing I want is to get a call at midnight that says that settings do not persist when edited through the settings dialog that I will have built.

So, user settings are stored god knows where, and application settings are read-only (no go). Is there anything else that I can do? I think app.config file has multiple purposes and I think I once saw it being used the way I want, I just cannot find the link.

Let me know if something is not clear.


Solution

  • You could create a class that holds your settings and then XML-serialize it:

    public class Settings
    {
        public string Setting1 { get; set; }
        public int Setting2 { get; set; }
    }
    
    static void SaveSettings(Settings settings)
    {
        var serializer = new XmlSerializer(typeof(Settings));
        using (var stream = File.OpenWrite(SettingsFilePath))
        {
            serializer.Serialize(stream, settings);
        }
    }
    
    static Settings LoadSettings()
    {
        if (!File.Exists(SettingsFilePath))
            return new Settings();
    
        var serializer = new XmlSerializer(typeof(Settings));
        using (var stream = File.OpenRead(SettingsFilePath))
        {
            return (Settings)serializer.Deserialize(stream);
        }
    }