Как обновить все настройки в файле 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.