User.config损坏

时间:2017-03-10 02:03:19

标签: c# .net wpf crash settings

所以我已经做了很多关于尝试解决这个问题的研究,但看起来似乎不能1)重现问题,但更重要的是2)找到一个最新的解决方案来修复它。

在2周的时间内已经发生了两次,其中随机的user.config文件将被破坏(例如,将丢失XML文件的块),从而导致下次启动时应用程序崩溃。

Cliffnotes:

  1. 我需要一个以编程方式处理此问题的最新解决方案(即,是CodeProject Handling Of Corrupted User Config的帖子还是其他帖子

  2. 我还需要一个可重复的案例来“破坏”user.config文件(除了删除它的块,因为它对我不起作用)才能测试上面的#1。

  3. 我遇到的解决方案:

    1. 我知道您可以手动导航到疯狂的路径(... / AppData /..././ 1.0.0.0/user.config)并删除它并重新运行该应用程序,但是,这对我们来说不是一个合适的解决方案。我们需要能够以编程方式捕获此错误,并相应地处理它。如果可能,最好不必重新启动应用程序。

    2. 我发现了一些帖子/答案,这篇文章略有不同CodeProject Handling Of Corrupted User Config 他们使用与该链接相同的机制,或使用ConfigurationManager命令打开配置文件并捕获异常。

    3. 我尝试了什么:

      1. 我的一个问题是我似乎无法访问C#4.5.2中的ConfigurationManager类。但是MSDN文档说它在当前框架中可用。所以我真的不能尝试

      2. 当我尝试手动“破坏”我的user.config文件来测试我的解决方案时,它没有给我带来任何问题,而且应用程序工作正常......这是令人担忧的,因为我找不到可重现的测试给定解决方案是否有效的情况(即上面链接中提供的不使用ConfigurationManager的情况)

      3. 非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

要手动损坏文件,只需删除其中的所有文本并保存文件。

要访问ConfigurationManager类,您必须向System.Configuration添加DLL引用。如果您在添加引用时需要帮助,请按以下列出的步骤online

  1. 在Solution Explorer中,右键单击项目节点,然后单击Add Reference。
  2. 在“添加引用”对话框中,选择指示要引用的组件类型的选项卡。
  3. 选择要引用的组件,然后单击“确定”。
  4. 要说明损坏,您可以使用如下所示的try / catch块:

    try {
        ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
    }
    catch (ConfigurationErrorsException exception) {
        Console.WriteLine("Settings are Corrupt!!");
        // handle error or tell user
        // to manually delete the file, you can do the following:
        File.Delete(exception.Filename); // this can throw an exception too, so be wary!
    }
    

    编辑:作为进一步说明,请注意,如果您在任何地方进行Settings.Upgrade()调用并且您的“旧”文件已损坏,这也会导致软件崩溃。请务必使用Settings.Upgrade()块围绕try/catch来电。

答案 1 :(得分:0)

我需要一个不会删除所有设置的更强大的解决方案 我的解决方案正在成功测试以创建备份。在任何后续失败时,都可以使用最后一个备份。退出应用程序以刷新备份是可能的。

            string configPathBackup;
            try
            {
                Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
                configPathBackup = config.FilePath + ".bak";
                config.SaveAs(configPathBackup, ConfigurationSaveMode.Full, true);
            }
            catch (ConfigurationErrorsException ex)
            {
                string filename = ex.Filename;
                configPathBackup = filename + ".bak";
                //_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);

                    if (!string.IsNullOrEmpty(configPathBackup) && File.Exists(configPathBackup))
                    {
                        File.Copy(configPathBackup, filename, true);
                    }

                }
                Kinesis.Properties.Settings.Default.Reload();
                //_logger.Error("Config file {0} does not exist", filename);
            }