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

本文关键字:存到文件 配置 | 更新日期: 2023-09-27 18:27:40

我有一些代码,包括单元测试,试图多次保存配置文件。当我第二次尝试保存配置文件时,我得到了以下错误:

无法将配置保存到文件[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();
}

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

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

谢谢你的帮助。

您能否将config保持在这两个代码块之间的范围内,这样就不必再次加载它了?

ConfigurationManager和System.Configuration命名空间背后的逻辑实际上相当复杂,因为它生成的配置不仅仅来自一个文件,即使您特别要求EXE配置。例如,user.config可能已损坏,从而无法加载整个EXE配置。我见过这种情况发生的次数多得数不清,我所知道的最好的解决方案就是删除用户配置并重新开始。同样,user.config也可能被锁定,因为ConfigurationManager本身正在对其进行操作。