无法将配置保存到文件多次

时间:2014-10-23 18:14:40

标签: c# configuration configurationmanager

我有代码,包括单元测试,试图多次保存配置文件。当我第二次尝试保存配置文件时出现此错误:

  

无法将配置保存到文件[FileName]

我的代码基本上是这样做的:

{
Configuration config = ConfigurationManager.OpenExeConfiguration(configName);
...change some values...
config.save();
}

然后再来

{
Configuration config = ConfigurationManager.OpenExeConfiguration(configName);
...change some values in a different way...
config.save();
}

当我第二次执行config.save时,有10秒的延迟,然后我收到错误。有谁知道如何解锁'这个档案?


我尝试保留配置变量的实例,即'范围内'但那没用。

private static Configuration GetConfiguration(string configName)
        {
            Configuration retval;
            if (_configs == null) _configs = new Dictionary<string, Configuration>();
            if (_configs.TryGetValue(configName, out retval)) return retval;
            retval = ConfigurationManager.OpenExeConfiguration(configName);
            _configs.Add(configName, retval);
            return retval;
        }

然后

{
Configuration config = GetConfiguration(configName);
...change some values...
config.save();
}

一起
{
Configuration config = GetConfiguration(configName);
...change some values in a different way...
config.save();
}

2 个答案:

答案 0 :(得分:1)

Ug的。我在我的代码中的其他地方引起了问题。

我有这样的功能:

    private bool FileHasString(string filename, string searchString)
    {
        string content = (new StreamReader(filename)).ReadToEnd();
        return content.IndexOf(searchString) > 0;
    }

我假设当流阅读器离开范围时,文件上的锁定结束。锁显然没有,这是造成麻烦的原因。

效果更好。

    private bool FileHasString(string filename, string searchString)
    {
        var sr = new StreamReader(filename);
        string content = sr.ReadToEnd();
        sr.Close();
        return content.IndexOf(searchString) > 0;
    }

感谢您的帮助。

答案 1 :(得分:0)

您可以在这两个代码块之间保留config,这样您就不必再次加载它了吗?

ConfigurationManager和System.Configuration命名空间背后的逻辑实际上非常复杂,因为它产生的配置不仅仅来自一个文件,即使您特别要求EXE配置。例如,user.config可能会被破坏,这会阻止加载整个EXE配置。我已经看到这种情况发生的次数比我可以计算的多,我所知道的最好的解决方法就是吹掉用户配置并重新开始。同样,user.config可能被锁定,因为ConfigurationManager本身正在对它做一些事情。