java应用程序配置存储_如何在Windows窗体应用程序中保存应用程序设置?

我想要实现的非常简单:我有一个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]属性在上面。

它是高度可配置的,您可以配置:-当数据持久保存并应用于全局或针对每个跟踪的对象时-序列化的方式-存储的位置(例如文件,数据库,在线,独立存储,注册表)-可以取消应用/持久化的规则属性数据

相信我,图书馆是一流的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值