首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新XML配置文件

更新XML配置文件
EN

Code Review用户
提问于 2014-07-08 21:08:01
回答 2查看 1.4K关注 0票数 2

除了以下方法之外,我一直无法找到更新用户配置文件的任何其他方法。

代码语言:javascript
复制
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类中的单数元素,而无需每次更新文件时销毁和重写该文件。

EN

回答 2

Code Review用户

回答已采纳

发布于 2014-07-16 13:40:01

最好,我希望能够更新XML文件中的节点,而不必每次更改时都重写整个文件。

一般来说,这是不可能的,因为XML是一种基于文本的格式。

假设您有以下文件:

代码语言:javascript
复制
<UserSettings>
    <Name>Aron</Name>
    <!-- other settings here -->
</UserSettings>

现在,您要将名称从“Aron”修改为“Aaron”:

代码语言:javascript
复制
<UserSettings>
    <Name>Aaron</Name>
    <!-- other settings here -->
</UserSettings>

但是这样做意味着Name行之后的所有内容都必须被文件中的一个字节移动,所以几乎整个文件都必须重写。

对于配置文件,这通常并不重要,因为它们往往相对较小。如果这对您很重要,您将不得不使用另一种方法来保存配置;一个很好的选择可能是嵌入式数据库,比如Server。

还有一个选择是使用.settings文件(内置于VS中)。它并不能使您免于重写文件,但它可以避免编写所有这些代码。

票数 1
EN

Code Review用户

发布于 2014-07-16 15:00:08

使用using构造确定地处理实现IDisposable接口的对象(另外,您正在创建一个new UserSetting()对象,该对象将被下一行的反序列化所立即丢弃):

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/56498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档