none
关于ConfigurationManager.OpenExeConfiguration(string exePath) RRS feed

  • 问题

  • 代码如下:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Configuration;
    
    namespace ConsoleApplication7
    {
        class opp
        {
            public static Configuration cf;
            static opp()
            {
                try
                {
                    cf = ConfigurationManager.OpenExeConfiguration(@"config\2");
                }
                catch 
                {
                    cf = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                    cf.AppSettings.Settings.Add("sss", "1234");
                    cf.SaveAs(@"config\2.config");
                }
                Console.WriteLine("{0}", cf.AppSettings.Settings["sss"].Value);
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                opp d = new opp();
                Console.ReadKey();
            }
        }
    }

    问题:

    当config文件夹下单独有文件“2.config”时程序会重新创建“2.config”覆盖原来文件,输出"1234";

    当既有文件“2.config”又有文件“2”时程序会读取“2.config”的内容输出"ffff",内容与文件“2”无关;

    当仅有文件“2”时会在opp d = new opp();处引发异常。

    请教原因。

    文件2.config内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <appSettings>
            <add key="sss" value="ffff" />
        </appSettings>
    </configuration>

    文件2内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <appSettings>
            <add key="sss" value="1234" />
        </appSettings>
    </configuration>

    2012年6月19日 8:20

答案

  • Hi 

    1. 因为你程序在读文件 config\2 的时候出错了,然后转到catch代码块。

    在catch代码块中,

    cf = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

    打开的是当前配置,后来你又另存为了。所以会覆盖。

    2. 这个代码

    cf = ConfigurationManager.OpenExeConfiguration(@"config\2");

    有两步: 第一步,判断路径是否有效,因为有这个文件,所以路径是对的,然后这个方法始终是要打开一个后缀名为.config文件的,所以读取到了2.config文件内的设置。

    这个同样适合第一种情况:因为没有2这个文件,所以判断路径出异常了。

    3. 第一步没有出错,文件存在,但是 当加上后缀名后,就没有这个文件了, 所以返回的cf对象是空的,然后你的代码还试图读取里面的属性,所以就出错了。 在

    Console.WriteLine("{0}", cf.AppSettings.Settings["sss"].Value);

    这一行。

    希望有帮助。


    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年6月20日 10:13
    版主