Подтвердить что ты не робот

Что заставляет 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);
}
4b9b3361

Ответ 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

Надеюсь, это поможет кому-то:)