Что заставляет user.config пустым? И как мне восстановить без перезапуска?
Я заметил на нескольких машинах, в которых мое приложение user.config файл каким-то образом становится поврежденным и пустым при открытии. Я не могу понять, почему это произошло. Есть ли общая вещь, которая может вызвать это? Любой способ безопасно предотвратить это?
Мой второй вопрос: как восстановить состояние? Я улавливаю исключение и удаляю файл user.config, но я не могу найти способ восстановить конфигурацию без перезапуска приложения. Все, что я делаю в объекте Properties, вызывает следующую ошибку:
"Системе конфигурации не удалось инициализировать"
Reset, перезагрузка и обновление ничего не помогают решить проблему.
Вот мой код для удаления после исключения:
catch (System.Configuration.ConfigurationErrorsException ex)
{
string fileName = "";
if (!string.IsNullOrEmpty(ex.Filename))
fileName = ex.Filename;
else
{
System.Configuration.ConfigurationErrorsException innerException = ex.InnerException as System.Configuration.ConfigurationErrorsException;
if (innerException != null && !string.IsNullOrEmpty(innerException.Filename))
fileName = innerException.Filename;
}
if (System.IO.File.Exists(fileName))
System.IO.File.Delete(fileName);
}
Ответы
Ответ 1
У нас была эта проблема в нашем приложении - и я не смог узнать ПОЧЕМУ (я предполагал, что я писал в Properties.Settings слишком часто, но я не уверен). Во всяком случае, мое обходное решение для ниже. Ключ должен удалить поврежденный файл и вызвать Properties.Settings.Default.Upgrade()
try
{
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
}
catch (ConfigurationErrorsException ex)
{
string filename = ex.Filename;
_logger.Error(ex, "Cannot open config file");
if (File.Exists(filename) == true)
{
_logger.Error("Config file {0} content:\n{1}", filename, File.ReadAllText(filename));
File.Delete(filename);
_logger.Error("Config file deleted");
Properties.Settings.Default.Upgrade();
// Properties.Settings.Default.Reload();
// you could optionally restart the app instead
}
else
{
_logger.Error("Config file {0} does not exist", filename);
}
}
Ответ 2
У меня такая же ситуация. Для меня, как только я удалю плохой файл конфигурации, я просто оставлю это приложение. Следующий доступ к настройкам будет использоваться по умолчанию для приложений.
Ответ 3
Это может быть немного поздно, но я сделал еще несколько исследований по этому вопросу. Файл user.config, похоже, поврежден по неизвестной причине и не позволяет запускать приложение. вы можете поместить небольшую логику try/catch в свой app.xaml.cs и проверить, когда она запускается, чтобы убедиться, что эта проблема поймана у источника. Когда приложение запускает и пытается программно перезагрузить файл settings.default и не работает, он перейдет к исключению, предоставив пользователю возможность удалить файл.
try {
Settings.Default.Reload();
}
catch ( ConfigurationErrorsException ex )
{
string filename = ( (ConfigurationErrorsException)ex.InnerException ).Filename;
if ( MessageBox.Show( "<ProgramName> has detected that your" +
" user settings file has become corrupted. " +
"This may be due to a crash or improper exiting" +
" of the program. <ProgramName> must reset your " +
"user settings in order to continue.\n\nClick" +
" Yes to reset your user settings and continue.\n\n" +
"Click No if you wish to attempt manual repair" +
" or to rescue information before proceeding.",
"Corrupt user settings",
MessageBoxButton.YesNo,
MessageBoxImage.Error ) == MessageBoxResult.Yes ) {
File.Delete( filename );
Settings.Default.Reload();
// you could optionally restart the app instead
} else
Process.GetCurrentProcess().Kill();
// avoid the inevitable crash
}
Кредит - http://www.codeproject.com/Articles/30216/Handling-Corrupt-user-config-Settings
Надеюсь, это поможет кому-то:)