用户配置文件损坏

10

我已经做了相当多的研究,试图找出这个问题的解决办法,但似乎无法1)重现这个问题,更重要的是2)找到一个最新的解决方案来修复它。

在两周内已经发生了两次,随机地user.config文件将会损坏(例如缺少XML文件的部分),因此导致下一次启动时应用程序崩溃。

Cliffnotes:

  1. 我需要一个最新的解决方案来以编程方式处理这个问题(即从CodeProject Handling Of Corrupted User Config或不同的帖子中获取),

  2. 我还需要一个可复现的情况,“损坏”user.config文件(除了删除其中的部分内容,因为对我来说没有用)以能够测试上面的#1。

我找到的解决方案:

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

  2. 我找到了一些帖子/答案,它们是这篇文章CodeProject Handling Of Corrupted User Config的稍微不同的版本,其中他们使用与该链接相同的机制,或者使用ConfigurationManager命令打开配置文件并捕获异常。

我尝试过的:

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

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

  • 非常感谢您的帮助!


    有人有什么线索或提示可以帮忙吗? - hpradogu
    放置一些二进制文件(例如.dotx文件)以重现问题。 - Thomas Weller
    它只是在同一目录下搜索新文件吗?它难道“只”搜索user.config吗?或者我漏掉了什么? - hpradogu
    当然了,您必须把它命名为"user.config" - Thomas Weller
    我有同样的问题。有时候电脑关机。 - Yuriy
    3个回答

    7

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

    为了访问ConfigurationManager类,您需要添加一个对System.Configuration的DLL引用。如果您需要帮助添加引用,请按照以下步骤在线进行操作:

    1. 在解决方案资源管理器中,右键单击项目节点,然后单击“添加引用”。
    2. 在“添加引用”对话框中,选择指示您要引用的组件类型的选项卡。
    3. 选择您要引用的组件,然后单击“确定”。

    为了解决损坏问题,您可以使用以下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块中。


    2

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

    Original Answer翻译成“最初的回答”

                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);
                }
    

    0

    我支持LarryB的回答。我曾经遇到过一个问题,文件的下半部分被填充了空值。我支持的应用程序在很大程度上利用了这些设置,因此失去配置是不可取的。我测试了他的解决方案,它非常完美!


    1
    你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接