valores de lectura y escritura de archivos .config in.NET

votos
2

Quiero utilizar una ruta personalizada para un archivo user.config, en lugar de tener .NET leer desde la ubicación predeterminada.

Estoy abriendo el archivo de la siguiente manera:

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

Pero no puedo encontrar la manera de leer la configuración de cada realidad, me sale un error de compilación diciendo que los valores son inaccesibles cuando trato de obtener un valor a través de datos de programa o ConfigurationSection.

¿Es necesario crear algún tipo de una clase contenedora para consumir los datos correctamente?

Publicado el 05/05/2012 a las 22:22
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
2

Recientemente estaba encargado de un problema similar, he tenido que cambiar la ubicación de archivos de configuración, donde se leen desde la ubicación predeterminada en el directorio de datos de programa de aplicación. Mi solución fue crear mis propios archivos de configuración que se derivan de ApplicationSettingsBase que especificaba una costumbre SettingsProvider . Mientras que la solución se sentía como una exageración en un primer momento, he encontrado que sea más flexible y fácil de mantener lo que había previsto.

Actualizar:

Ejemplos de Ajustes del archivo:

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

SettingsProvider muestra:

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
    }
}
Respondida el 06/05/2012 a las 04:46
fuente por usuario

votos
1

Unas pocas mejoras:

1) De carga hasta un poco más simple, sin necesidad de que las otras líneas:

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

2) El acceso AppSettingscorrectamente:

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

3) Si desea una sección de configuración personalizada, utilice esta herramienta: http://csd.codeplex.com/

Respondida el 05/05/2012 a las 22:51
fuente por usuario

votos
0

Nunca terminó siendo el enfoque de trabajo Administrador de configuración. Después de pasar un día embrollo medio sin avances, decidí rodar mi propia solución que mis necesidades son básicas.

Aquí está la solución que se me ocurrió en el final:

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);
        }
    }
}
Respondida el 06/05/2012 a las 14:34
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more