Как обновить все настройки в файле user.config при изменении номера версии?

У меня есть много пользовательских настроек, которые хранятся в user.config объектами, которые наследуются от ApplicationSettingsBase.

Параметр SettingsKey для каждого экземпляра создается динамически во время выполнения, используя в основном имя формы. Поэтому могут быть сотни.

Я прочитал много вопросов и ответов (как этот - Как вы сохраняете настройки user.config для разных версий сборок в.net?), И все они рекомендуют оборачивать вызов ApplicationSettingsBase.Upgrade() при проверке номера версии.

Проблема в том, что (насколько я могу судить) вам нужно знать каждый *SettingsKey(значение, используемое для создания экземпляра всех объектов ApplicationSettingsBase, чтобы, в свою очередь, вызывать метод обновления).

Есть ли способ обновить все настройки user.config за один раз или альтернативно, перебрать все настройки в файле, чтобы обновить их?

1 ответ

Решение

Подход, который я придумала, - это что-то вроде хака, но я чувствую, что слишком много подходов провалились, и мне нужно что-то делать:-(

Я прибег к копированию предыдущей версии user.config в случае запуска новой версии.

Во-первых, определите, требуется ли обновление, как рекомендуют многие варианты этого вопроса.

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
Version version = assembly.GetName().Version;

if (version.ToString() != Properties.Settings.Default.ApplicationVersion)
{
    copyLastUserConfig(version);
}

затем скопировать последний user.config....

private static void copyLastUserConfig(Version currentVersion)
{
try
{
    string userConfigFileName = "user.config";


    // Expected location of the current user config
    DirectoryInfo currentVersionConfigFileDir = new FileInfo(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath).Directory;
    if (currentVersionConfigFileDir == null)
    {
        return;
    }

    // Location of the previous user config

    // grab the most recent folder from the list of user's settings folders, prior to the current version
    var previousSettingsDir = (from dir in currentVersionConfigFileDir.Parent.GetDirectories()
                               let dirVer = new { Dir = dir, Ver = new Version(dir.Name) }
                               where dirVer.Ver < currentVersion
                               orderby dirVer.Ver descending
                               select dir).FirstOrDefault();

    if (previousSettingsDir == null)
    {
        // none found, nothing to do - first time app has run, let it build a new one
        return;
    }

    string previousVersionConfigFile = string.Concat(previousSettingsDir.FullName, @"\", userConfigFileName);
    string currentVersionConfigFile = string.Concat(currentVersionConfigFileDir.FullName, @"\", userConfigFileName);

    if (!currentVersionConfigFileDir.Exists)
    {
        Directory.CreateDirectory(currentVersionConfigFileDir.FullName);
    }

    File.Copy(previousVersionConfigFile, currentVersionConfigFile, true);

}
catch (Exception ex)
{
    HandleError("An error occurred while trying to upgrade your user specific settings for the new version. The program will continue to run, however user preferences such as screen sizes, locations etc will need to be reset.", ex);
}
}

Спасибо Allon Guralnek за его ответ на этот вопрос ( как вы обновляете Settings.settings, когда тип хранимых данных изменяется?) Для Linq в середине, который получает PreviousSettingsDir.

Другие вопросы по тегам