读取和写入值 in.NET .config 文件

本文关键字:NET config 文件 in 读取 | 更新日期: 2023-09-27 18:33:21

我想对user.config文件使用自定义路径,而不是让.NET从默认位置读取它。

我像这样打开文件:

ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
configMap.ExeConfigFilename = String.Format("{0}''user.config",AppDataPath);
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.PerUserRoamingAndLocal);

但是我不知道如何实际从中读取设置,我收到一个编译错误,指出当我尝试通过 AppData 或 ConfigurationSection 获取值时,这些值无法访问。

我是否需要创建某种包装类来正确使用数据?

读取和写入值 in.NET .config 文件

我最近遇到了类似的问题,我不得不将读取设置文件的位置从 AppData 中的默认位置更改为应用程序目录。我的解决方案是创建我自己的设置文件,这些文件派生自指定自定义设置提供程序的应用程序设置库。虽然该解决方案起初感觉有点矫枉过正,但我发现它比我预期的更灵活且易于维护。

更新:

示例设置文件:

public class BaseSettings : ApplicationSettingsBase
{
    protected BaseSettings(string settingsKey)
       { SettingsKey = settingsKey.ToLower(); }

    public override void Upgrade()
    {
         if (!UpgradeRequired)
             return;
         base.Upgrade();
         UpgradeRequired = false;
         Save();
    }

    [SettingsProvider(typeof(MySettingsProvider)), UserScopedSetting]
    [DefaultSettingValue("True")]
    public bool UpgradeRequired
    {
         get { return (bool)this["UpgradeRequired"]; }
         set { this["UpgradeRequired"] = value; }
    }
}

示例设置提供程序:

public sealed class MySettingsProvider : SettingsProvider
{
    public override string ApplicationName { get { return Application.ProductName; } set { } }
    public override string Name { get { return "MySettingsProvider"; } }

    public override void Initialize(string name, NameValueCollection col)
         { base.Initialize(ApplicationName, col); }

    public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection propertyValues)
    {
       // Use an XmlWriter to write settings to file. Iterate PropertyValueCollection and use the SerializedValue member
    }

    public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyCollection props)
    {
       // Read values from settings file into a PropertyValuesCollection and return it
    }

    static MySettingsProvider()
    {
        appSettingsPath_ = Path.Combine(new FileInfo(Application.ExecutablePath).DirectoryName, settingsFileName_);
        settingsXml_ = new XmlDocument();
        try { settingsXml_.Load(appSettingsPath_); }
        catch (XmlException) { CreateXmlFile_(settingsXml_); } //Invalid settings file
        catch (FileNotFoundException) { CreateXmlFile_(settingsXml_); } // Missing settings file
    }
}

一些改进:

1)加载起来更简单一点,不需要其他行:

var config = ConfigurationManager.OpenExeConfiguration(...);

2)正确访问AppSettings

config.AppSettings.Settings[...]; // and other things under AppSettings

3) 如果需要自定义配置部分,请使用此工具:http://csd.codeplex.com/

我最终从未让配置管理器方法正常工作。 在花了半天的时间糊里糊涂没有任何进展之后,我决定推出自己的解决方案,因为我的需求是基本的。

这是我最后想出的解决方案:

public class Settings
{
    private XmlDocument _xmlDoc;
    private XmlNode _settingsNode;
    private string _path;
    public Settings(string path)
    {
        _path = path;
        LoadConfig(path);
    }
    private void LoadConfig(string path)
    {
       //TODO: add error handling
        _xmlDoc = null;
        _xmlDoc = new XmlDocument();
        _xmlDoc.Load(path);
        _settingsNode = _xmlDoc.SelectSingleNode("//appSettings");
    }
    //
    //use the same structure as in .config appSettings sections
    //
    public string this[string s]
    {
        get
        {
            XmlNode n = _settingsNode.SelectSingleNode(String.Format("//add[@key='{0}']", s));
            return n != null ? n.Attributes["value"].Value : null;
        }
        set
        {
            XmlNode n = _settingsNode.SelectSingleNode(String.Format("//add[@key='{0}']", s));
            //create the node if it doesn't exist
            if (n == null)
            {
                n=_xmlDoc.CreateElement("add");
                _settingsNode.AppendChild(n);
                XmlAttribute attr =_xmlDoc.CreateAttribute("key");
                attr.Value = s;
                n.Attributes.Append(attr);
                attr = _xmlDoc.CreateAttribute("value");
                n.Attributes.Append(attr);
            }
            n.Attributes["value"].Value = value;
            _xmlDoc.Save(_path);
        }
    }
}