在c#应用程序中保存配置数据的最佳方法是什么? 请注意,这些数据可能会动态更改。 据我所知,可以使用ConfigurationManager类。但我听说这不是一个很好的方法。
答案 0 :(得分:2)
使用内置设置机制。但请单独留下配置管理器并使用您的设置,如
Properties.Settings.Default.x
答案 1 :(得分:1)
使用ConfigurationManager(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>
很简单,或者你怎么想?