Search code examples
c#wpfapplication-settings

Store user settings file in executables directory


I'm developing a software in .NET 4.0, which reads and writes application settings. On finish the software will be stored on a file server. No local instances will be executed.

By default the user settings XML file is stored in every users AppData\... directory, but I want to change the file location to the same directory the executable is stored.

This means, that all users should use the same XML user-settings file with modified contents.

I've read this question and answeres where a user describes how to realize that in JSON format.

Question: Isn't there any other (simple) way to tell the Settings class, where to read from and write to user settings?

The following has been discussed:

  • Users will always have enough access rights to modify the settings file.
  • Modifications on settings should be picked up by other users.
  • Users will start the application from different network computers.
  • I could implement my own XML file handled by the application (I'll keep this in mind).

Solution

  • I added a custom Application Configuration File called AppSettings.config to my project and set its Copy to output property to Copy if newer (this copies the config file into the executables folder on building the project.

    My settings must be classified as appSettings, not applicationSettings (non-editable) or userSettings (stored in the users AppData folder). Here's an example:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <!-- single values -->
        <add key="Name" value="Chris" />
        <add key="Age" value="25" />
    
        <!-- lists, semi-colon separated-->
        <add key="Hobbies" value="Football;Volleyball;Wakeboarding" />
      </appSettings>
    </configuration>
    

    Look at the code below, how to access and modify them:

    Configuration AppConfiguration =
        ConfigurationManager.OpenMappedExeConfiguration(
            new ExeConfigurationFileMap {ExeConfigFilename = "AppSettings.config"}, ConfigurationUserLevel.None);
    
    var settings = AppConfiguration.AppSettings.Settings;
    // access
    var name = settings["Name"].Value;
    var age = settings["Age"].Value;
    var hobbies = settings["Hobbies"].Value.Split(new[]{';'});
    // modify
    settings["Age"].Value = "50";
    // store (writes the physical file)
    AppConfiguration.Save(ConfigurationSaveMode.Modified);
    

    I used the built-in app.config for default application settings and wanted to separate them from the editable global settings in AppSettings.config. That's why I use a custom config file.


    That's not directly an answer to the question, but it solves the problem on how to store and share editable application settings in custom configuration files.

    Hope it helps any other users! :-)