所以我已经做了很多关于尝试解决这个问题的研究,但看起来似乎不能1)重现问题,但更重要的是2)找到一个最新的解决方案来修复它。
在2周的时间内已经发生了两次,其中随机的user.config文件将被破坏(例如,将丢失XML文件的块),从而导致下次启动时应用程序崩溃。
Cliffnotes:
我需要一个以编程方式处理此问题的最新解决方案(即,是CodeProject Handling Of Corrupted User Config的帖子还是其他帖子
我还需要一个可重复的案例来“破坏”user.config文件(除了删除它的块,因为它对我不起作用)才能测试上面的#1。
我遇到的解决方案:
我知道您可以手动导航到疯狂的路径(... / AppData /..././ 1.0.0.0/user.config)并删除它并重新运行该应用程序,但是,这对我们来说不是一个合适的解决方案。我们需要能够以编程方式捕获此错误,并相应地处理它。如果可能,最好不必重新启动应用程序。
我发现了一些帖子/答案,这篇文章略有不同CodeProject Handling Of Corrupted User Config 他们使用与该链接相同的机制,或使用ConfigurationManager命令打开配置文件并捕获异常。
我尝试了什么:
我的一个问题是我似乎无法访问C#4.5.2中的ConfigurationManager类。但是MSDN文档说它在当前框架中可用。所以我真的不能尝试
当我尝试手动“破坏”我的user.config文件来测试我的解决方案时,它没有给我带来任何问题,而且应用程序工作正常......这是令人担忧的,因为我找不到可重现的测试给定解决方案是否有效的情况(即上面链接中提供的不使用ConfigurationManager的情况)
非常感谢任何帮助!
答案 0 :(得分:3)
要手动损坏文件,只需删除其中的所有文本并保存文件。
要访问ConfigurationManager
类,您必须向System.Configuration
添加DLL引用。如果您在添加引用时需要帮助,请按以下列出的步骤online:
要说明损坏,您可以使用如下所示的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);
}