我想要实现的非常简单:我有一个Windows窗体(。NET 3.5)应用程序使用路径来读取信息。用户可以使用我提供的选项表单修改此路径。
现在,我想将路径值保存到一个文件中以供以后使用。这将是保存到该文件中的众多设置之一。该文件将直接位于应用程序文件夹中。
我知道有三种选择:
配置文件(appname.exe.config)
注册表
自定义XML文件
我读到。net配置文件不能将值保存回配置文件。至于注册表,我想尽量远离它。
这是否意味着我应该使用自定义XML文件来保存配置设置?
如果是这样,我想看看代码的例子(c#)。
我看过其他关于这个问题的讨论,但我仍然不清楚。
registry/configurationSettings/XML参数似乎仍然非常活跃。随着技术的进步,我都用过了,但我最喜欢的是基于Threed的系统和隔离存储的结合。
下面的示例允许将名为properties的对象存储到隔离存储中的文件中。如:
AppSettings.Save(myobject, "Prop1,Prop2", "myFile.jsn");
可以使用以下方法恢复属性:
AppSettings.Load(myobject, "myFile.jsn");
这只是一个示例,并不是最佳实践的建议。
internal static class AppSettings
{
internal static void Save(object src, string targ, string fileName)
{
Dictionary<string, object> items = new Dictionary<string, object>();
Type type = src.GetType();
string[] paramList = targ.Split(new char[] { ',' });
foreach (string paramName in paramList)
items.Add(paramName, type.GetProperty(paramName.Trim()).GetValue(src, null));
try
{
// GetUserStoreForApplication doesn't work - can't identify.
// application unless published by ClickOnce or Silverlight
IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForAssembly();
using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileName, FileMode.Create, storage))
using (StreamWriter writer = new StreamWriter(stream))
{
writer.Write((new JavaScriptSerializer()).Serialize(items));
}
}
catch (Exception) { } // If fails - just don't use preferences
}
internal static void Load(object tar, string fileName)
{
Dictionary<string, object> items = new Dictionary<string, object>();
Type type = tar.GetType();
try
{
// GetUserStoreForApplication doesn't work - can't identify
// application unless published by ClickOnce or Silverlight
IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForAssembly();
using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileName, FileMode.Open, storage))
using (StreamReader reader = new StreamReader(stream))
{
items = (new JavaScriptSerializer()).Deserialize<Dictionary<string, object>>(reader.ReadToEnd());
}
}
catch (Exception) { return; } // If fails - just don't use preferences.
foreach (KeyValuePair<string, object> obj in items)
{
try
{
tar.GetType().GetProperty(obj.Key).SetValue(tar, obj.Value, null);
}
catch (Exception) { }
}
}
}
我想分享我为此建立的一个库。这是一个很小的库,但比.settings文件有很大的改进(恕我冒昧)。
这个库被称为Jot (GitHub)。这是我写的一篇关于它的旧的代码项目文章。
下面是如何使用它来跟踪窗口的大小和位置:
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]属性。
它是高度可配置的,你可以配置:
-当数据被持久化并应用于全局或每个跟踪对象时
-它是如何序列化的
-存储在哪里(例如文件,数据库,在线,隔离存储,注册表)
-可以取消为属性应用/持久化数据的规则
相信我,图书馆是一流的!
据我所知,.NET确实支持使用内置的应用程序设置功能持久化设置:
The Application Settings feature of Windows Forms makes it easy to create, store, and maintain custom application and user preferences on the client computer. With Windows Forms application settings, you can store not only application data such as database connection strings, but also user-specific data, such as user application preferences. Using Visual Studio or custom managed code, you can create new settings, read them from and write them to disk, bind them to properties on your forms, and validate settings data prior to loading and saving.
- http://msdn.microsoft.com/en-us/library/k4s6c3a0.aspx
如果你使用Visual Studio,那么很容易获得持久化设置。在解决方案资源管理器中右键单击项目并选择属性。选择“设置”选项卡,如果“设置”不存在,则单击超链接。
使用Settings选项卡创建应用程序设置。Visual Studio创建文件设置。settings和settings . designer .settings包含从ApplicationSettingsBase继承的单例类settings。你可以从你的代码中访问这个类来读取/写入应用程序设置:
Properties.Settings.Default["SomeProperty"] = "Some Value";
Properties.Settings.Default.Save(); // Saves settings in application configuration file
此技术适用于控制台、Windows窗体和其他项目类型。
注意,您需要设置设置的scope属性。如果你选择了应用范围,那么Settings.Default。<你的属性>将是只读的。
参考:如何:在运行时使用c# - Microsoft Docs编写用户设置