除了以下方法之外,我一直无法找到更新用户配置文件的任何其他方法。
public class SettingServices : ISettingServices
{
public UserSetting GetUserSetting()
{
XmlSerializer reader = new XmlSerializer(typeof(UserSetting));
StreamReader file = new StreamReader(UserConfig);
UserSetting settings = new UserSetting();
settings = (UserSetting)reader.Deserialize(file);
return settings;
}
public void CreateUserSetting(UserSetting userSetting)
{
XmlSerializer writer = new XmlSerializer(typeof(UserSetting));
StreamWriter file = new StreamWriter(UserConfig);
writer.Serialize(file, userSetting);
file.Close();
}
public void UpdateUserSetting(UserSetting userSetting)
{
UserSetting currentSettings = GetUserSetting();
UserSetting newSetting = new UserSetting();
newSetting.Name = (userSetting.Name == null) ? currentSettings.Name : userSetting.Name;
newSetting.ViewChangeLog = (userSetting.ViewChangeLog == null) ? currentSettings.ViewChangeLog : userSetting.ViewChangeLog;
newSetting.PrimaryRowColor = (userSetting.PrimaryRowColor == null) ? currentSettings.PrimaryRowColor : userSetting.PrimaryRowColor;
newSetting.SecondaryRowColor = (userSetting.SecondaryRowColor == null) ? currentSettings.SecondaryRowColor : userSetting.SecondaryRowColor;
newSetting.Font = (userSetting.Font == null) ? currentSettings.Font : userSetting.Font;
CreateUserSetting(newSetting);
}
private static string UserConfig
{
get
{
string configDirectory = new Uri(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\CVS\\ICMQuery").LocalPath;
return new Uri(configDirectory + "\\" + System.Environment.UserName + ".config").LocalPath;
}
}
}有人能给我看看灯吗。我希望能够更新UserSetting类中的单数元素,而无需每次更新文件时销毁和重写该文件。
发布于 2014-07-16 13:40:01
最好,我希望能够更新XML文件中的节点,而不必每次更改时都重写整个文件。
一般来说,这是不可能的,因为XML是一种基于文本的格式。
假设您有以下文件:
<UserSettings>
<Name>Aron</Name>
<!-- other settings here -->
</UserSettings>现在,您要将名称从“Aron”修改为“Aaron”:
<UserSettings>
<Name>Aaron</Name>
<!-- other settings here -->
</UserSettings>但是这样做意味着Name行之后的所有内容都必须被文件中的一个字节移动,所以几乎整个文件都必须重写。
对于配置文件,这通常并不重要,因为它们往往相对较小。如果这对您很重要,您将不得不使用另一种方法来保存配置;一个很好的选择可能是嵌入式数据库,比如Server。
还有一个选择是使用.settings文件(内置于VS中)。它并不能使您免于重写文件,但它可以避免编写所有这些代码。
发布于 2014-07-16 15:00:08
使用using构造确定地处理实现IDisposable接口的对象(另外,您正在创建一个new UserSetting()对象,该对象将被下一行的反序列化所立即丢弃):
public UserSetting GetUserSetting()
{
XmlSerializer reader = new XmlSerializer(typeof(UserSetting));
using (StreamReader file = new StreamReader(UserConfig))
{
return (UserSetting)reader.Deserialize(file);
}
}
public void CreateUserSetting(UserSetting userSetting)
{
XmlSerializer writer = new XmlSerializer(typeof(UserSetting));
using (StreamWriter file = new StreamWriter(UserConfig))
{
writer.Serialize(file, userSetting);
}
}https://codereview.stackexchange.com/questions/56498
复制相似问题