我想要实现的非常简单:我有一个Windows Forms(.NET 3.5)应用程序,该应用程序使用读取信息的路径。 用户可以使用我提供的选项表单来修改此路径。
现在,我想将路径值保存到文件中以备后用。 这将是保存到该文件的众多设置之一。 该文件将直接位于应用程序文件夹中。
我了解三个选项可供选择:
ConfigurationSettings文件(appname.exe.config)
登记处
自定义XML文件
我读到没有预见到.NET配置文件来将值保存回它。 至于注册表,我想尽可能地远离它。
这是否意味着我应该使用自定义XML文件保存配置设置? 如果是这样,我想查看该代码示例(C#)。
我已经看到了有关该主题的其他讨论,但是对我来说仍然不清楚。
#1楼
我不喜欢使用web.config或app.config的建议解决方案。 尝试读取您自己的XML。 看看
#2楼
有时您想要摆脱保留在传统web.config或app.config文件中的那些设置。 您希望对设置条目和单独的数据设计的部署进行更精细的控制。 或要求是允许在运行时添加新条目。
我可以想象两个不错的选择:
强类型版本和
面向对象的版本。
强类型版本的优点是强类型设置名称和值。 不会混淆名称或数据类型。 缺点是必须对更多设置进行编码,不能在运行时添加。
使用面向对象的版本的优点是可以在运行时添加新设置。 但是您没有强类型的名称和值。 必须小心使用字符串标识符。 获取值时必须知道较早保存的数据类型。
您可以在此处找到这两种功能齐全的实现的代码。
#3楼
除了使用自定义XML文件以外,我们还可以使用其他更友好的文件格式:JSON或YAML文件。
如果您使用.NET 4.0 dynamic,那么此库确实非常易于使用(序列化,反序列化,嵌套对象支持和按需排序输出顺序+将多个设置合并为一个) JsonConfig (用法等效于ApplicationSettingsBase)
对于.NET YAML配置库...我还没有找到一个像JsonConfig一样易于使用的库
您可以将设置文件存储在此处列出的多个特殊文件夹(针对所有用户和每个用户) Environment.SpecialFolder枚举和多个文件(默认只读,针对每个角色,针对每个用户等)
如果选择使用多个设置,则可以合并这些设置:例如,合并默认+ BasicUser + AdminUser的设置。 您可以使用自己的规则:最后一个覆盖值,依此类推。
#4楼
一种简单的方法是使用配置数据对象,将其与应用程序的名称一起另存为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 configuration file
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 configuration file
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();
}
}
}
现在,您可以创建一个实例,并在表单的load和close事件中使用它:
private CConfigMng oConfigMng = new CConfigMng();
private void Form1_Load(object sender, EventArgs e)
{
// Load configuration
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 configuration
oConfigMng.Config.StartPos = Location;
oConfigMng.Config.StartSize = Size;
oConfigMng.SaveConfig();
}
生成的XML文件也是可读的:
70
278
253
229
#5楼
我想分享我为此建立的图书馆。 这是一个很小的库,但是相对于.settings文件有很大的改进(IMHO)。
使用它来跟踪窗口的大小和位置的方法如下:
public MainWindow()
{
InitializeComponent();
_stateTracker.Configure(this)
.IdentifyAs("MyMainWindow")
.AddProperties(nameof(Height), nameof(Width), nameof(Left), nameof(Top), nameof(WindowState))
.RegisterPersistTrigger(nameof(Closed))
.Apply();
}
与.settings文件相比 ,它的好处是:代码少得多,而且出错率也少得多,因为您只需提及每个属性一次 。
对于设置文件,您需要五次提及每个属性:一次是在您显式创建该属性时,另一次是在代码中四次来回复制值。
存储,序列化等都是完全可配置的。 当目标对象是由IOC容器创建的时,您可以[将其连接] [],以便它自动将跟踪应用于它解析的所有对象,以便对属性进行持久化处理所需要做的就是拍打[Trackable]属性在上面。
它是高度可配置的,您可以配置:-当数据持久保存并应用于全局或针对每个跟踪的对象时-序列化的方式-存储的位置(例如文件,数据库,在线,独立存储,注册表)-可以取消应用/持久化的规则属性数据
相信我,图书馆是一流的!