【问题标题】:How can I watch the user.config file and reload the settings when it changes?如何查看 user.config 文件并在更改时重新加载设置?
【发布时间】:2010-10-27 10:08:54
【问题描述】:

我有一种情况,我正在运行我的 WPF 应用程序的多个实例。我希望实例共享相同的 user.config 文件。目前,最后写入 user.config 文件的实例获胜。我希望所有实例都监视 user.config 文件并在另一个实例更改它时重新加载设置。 user.config 文件当前位于此处:

C:\Documents and Settings\用户名\Local Settings\Application Data\公司名称\ExeName.exe_StrongName_hash\1.0.0.0

例如,C:\Documents and Settings\usename\Local Settings\Application Data\Company\5kAdCon.exe_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko\1.0.0.0

有没有办法让我获得这个完整路径(包括哈希),以便我可以在 user.config 文件中添加一个文件观察器?

如果是这样,我想在文件更改时重新加载设置。调用这个方法就这么简单吗?

Properties.Settings.Default.Reload();

【问题讨论】:

  • 如果一个实例的未保存设置被另一个实例的覆盖,您可以吗?在我看来,用户可能不希望所有设置都重置。至少为此提出一个对话框。
  • 在大多数情况下,是的。我尽量避免最后关闭哪个实例。现在关闭的最后一个实例的设置是被保存的。

标签: c# wpf settings user-config


【解决方案1】:

我找到了。以下代码将返回 user.config 文件的路径。您需要添加对 System.Configuration.dll 的引用

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
string path = config.FilePath;

现在我可以使用FileSystemWatcher 在文件更改时收到通知。

【讨论】:

    【解决方案2】:

    您应该缓存文件并实现 CacheDependency 以便在对文件进行任何更改时将文件重新加载到缓存中。我在我的应用程序中使用了一个权限 xml 文件,该文件存储在缓存中,并在文件被更改时重新加载。代码如下:

    protected void Page_Load(object sender, EventArgs e)
    {
            XmlDocument permissionsDoc = null;
    
            if (Cache["Permissions"] == null)
            {
                string path = Server.MapPath("~/XML/Permissions.xml");
                permissionsDoc = new XmlDocument();
                permissionsDoc.Load(Server.MapPath("~/XML/Permissions.xml"));
                Cache.Add("Permissions", permissionsDoc,
                                new CacheDependency(Server.MapPath("~/XML/Permissions.xml")),
                               Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
                        CacheItemPriority.Default, new CacheItemRemovedCallback(ReloadPermissionsCallBack));
            }
            else
            {
                permissionsDoc = (XmlDocument)Cache["Permissions"];
            }
    }
    
    private void ReloadPermissionsCallBack(string key, object value, CacheItemRemovedReason reason)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(Server.MapPath("~/XML/Permissions.xml"));
            Cache.Insert("Permissions", doc ,
                                new CacheDependency(Server.MapPath("~/XML/Permissions.xml")),
                               Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
                        CacheItemPriority.Default, new CacheItemRemovedCallback(ReloadPermissionsCallBack));
        }
    

    缓存还会提高您的应用程序性能。

    【讨论】:

    • 类似的方法可能有效,但我最大的问题是我不知道 user.config 文件的路径。我正在使用内置的应用程序设置 (msdn.microsoft.com/en-us/library/a65txexh.aspx),但不知道如何构建 MS 为 user.config 目录选择的路径。它看起来像这样:C:\Documents and Settings\usename\Local Settings\Application Data\Company\5kAdCon.exe_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko\1.0.0.0
    【解决方案3】:

    你可以使用 fileSystemWatcher 控件吗?

    它有一个可以触发的修改事件

    【讨论】:

    • 是的,但我不知道如何获取我需要观看的文件的路径。路径如下所示:C:\Documents and Settings\usename\Local Settings\Application Data\Company\5kAdCon.exe_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko\1.0.0.0。有没有办法构建这条路径?
    • 程序如何知道它在哪里?我知道你可以使用环境变量来查找用户名,什么不是。除非其余部分是静态的,否则我不知道约定是什么。
    • 对,这是我的问题。我不知道如何获取路径的“_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko”部分。
    • 很明显,程序知道我怀疑这将是一种非常巧妙的做事方式,但您可以扫描所有内容并仅在 config.conf 上过滤
    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2023-03-18
    • 2013-10-06
    相关资源
    最近更新 更多