c#在c#应用程序中保存配置数据的最佳方法是什么。

时间:2015-12-12 10:09:59

标签: c#

在c#应用程序中保存配置数据的最佳方法是什么? 请注意,这些数据可能会动态更改。 据我所知,可以使用ConfigurationManager类。但我听说这不是一个很好的方法。

3 个答案:

答案 0 :(得分:2)

使用内置设置机制。但请单独留下配置管理器并使用您的设置,如

Properties.Settings.Default.x 

答案 1 :(得分:1)

使用ConfigurationManager(web.config / app.config)没有任何问题。 对于不同类型的配置数据,我建议如下;

  • 永不更改只读配置数据

    • 应用程序或使用(程序集级别)属性中的硬编码。这个 需要在配置数据时重新编译/重新安装app 变化。
  • 几乎从不改变只读配置数据

    • 使用web.config / app.config中的<appSettings><connectionStrings>或其他部分(更改时通常需要重新启动应用,尤其是在启动时只读取配置数据时)
  • 在应用程序中维护的服务器端可写配置数据

    • 使用C:\ProgramData\<name of your company>\<name of your app>
    • 中的数据库或文件
  • 应用程序(桌面应用程序)中维护的客户端可写配置数据

    • 使用C:\Users\<clients login name>\AppData\Local\<name of your company>\<name of your app>\中的文件。如果您需要在其他计算机上使用配置数据(使用相同的AD域),请使用AppData下的LocalRoaming文件夹(不要将太多配置数据放在此处放置的文件中,因为它们需要在两者之间传输计算机)

答案 2 :(得分:0)

一种简单的方法是使用配置数据对象,将其保存为xml文件,并在本地文件夹中包含应用程序的名称,并在启动时将其读回。

以下是存储表单位置和大小的示例。

配置数据对象是强类型的,易于使用:

[Serializable()]
public class CConfigDO
{
    private System.Drawing.Point m_oStartPos;
    private System.Drawing.Size m_oStartSize;

    public System.Drawing.Point StartPos
    {
        get { return m_oStartPos; }
        set { m_oStartPos = value; }
    }

    public System.Drawing.Size StartSize
    {
        get { return m_oStartSize; }
        set { m_oStartSize = value; }
    }
}

用于保存和加载的经理类:

public class CConfigMng
{
    private string m_sConfigFileName = System.IO.Path.GetFileNameWithoutExtension(System.Windows.Forms.Application.ExecutablePath) + ".xml";
    private CConfigDO m_oConfig = new CConfigDO();

    public CConfigDO Config
    {
        get { return m_oConfig; }
        set { m_oConfig = value; }
    }

    // Load configfile
    public void LoadConfig()
    {
        if (System.IO.File.Exists(m_sConfigFileName))
        {
            System.IO.StreamReader srReader = System.IO.File.OpenText(m_sConfigFileName);
            Type tType = m_oConfig.GetType();
            System.Xml.Serialization.XmlSerializer xsSerializer = new System.Xml.Serialization.XmlSerializer(tType);
            object oData = xsSerializer.Deserialize(srReader);
            m_oConfig = (CConfigDO)oData;
            srReader.Close();
        }
    }

    // Save configfile
    public void SaveConfig()
    {
        System.IO.StreamWriter swWriter = System.IO.File.CreateText(m_sConfigFileName);
        Type tType = m_oConfig.GetType();
        if (tType.IsSerializable)
        {
            System.Xml.Serialization.XmlSerializer xsSerializer = new System.Xml.Serialization.XmlSerializer(tType);
            xsSerializer.Serialize(swWriter, m_oConfig);
            swWriter.Close();
        }
    }
}

现在,您可以在加载和关闭事件中的表单中使用它:

    private void Form1_Load(object sender, EventArgs e)
    {
        // Load config
        oConfigMng.LoadConfig();
        if (oConfigMng.Config.StartPos.X != 0 || oConfigMng.Config.StartPos.Y != 0)
        {
            Location = oConfigMng.Config.StartPos;
            Size = oConfigMng.Config.StartSize;
        }
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        // Save config
        oConfigMng.Config.StartPos = Location;
        oConfigMng.Config.StartSize = Size;
        oConfigMng.SaveConfig();
    }

生成的xml文件也是可读的:

<?xml version="1.0" encoding="utf-8"?>
<CConfigDO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <StartPos>
    <X>70</X>
    <Y>278</Y>
  </StartPos>
  <StartSize>
    <Width>253</Width>
    <Height>229</Height>
  </StartSize>
</CConfigDO>

很简单,或者你怎么想?