当user.config文件发生更改时,我该如何监视它并重新加载设置?

3
我有这样一种情况,我正在运行多个实例的WPF应用程序。我希望这些实例共享相同的user.config文件。目前,无论哪个实例最后写入user.config文件都会获胜。我更喜欢所有实例都监视user.config文件,并在其他实例更改它时重新加载设置。user.config文件当前位于此位置:
C:\Documents and Settings\用户名\Local Settings\Application Data\公司名称\ExeName.exe_StrongName_哈希值\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();

如果一个实例的未保存设置被另一个实例覆盖,你觉得这样可以吗?我认为用户可能不希望所有设置都被重置。至少应该弹出对话框来确认。 - Szymon Rozga
大部分是的。我试图避免最后关闭的实例对结果产生影响。目前,最后关闭的实例的设置将被保存。 - John Myczek
3个回答

6
我找到了它。以下代码将返回用户配置文件的路径。您需要添加对System.Configuration.dll的引用。
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
string path = config.FilePath;

现在我可以使用FileSystemWatcher来获取文件更改的通知。

1
你应该缓存文件并实现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));
    }

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


可能那样做可以,但我最大的问题是我不知道用户配置文件所在的路径。 我正在使用内置应用程序设置(http://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 - John Myczek

0
你能使用fileSystemWatcher控件吗?
它有一个可以触发的修改事件。

2
是的,但我不知道如何获取需要监视的文件路径。路径看起来像这样:C:\ Documents and Settings \ usename \ Local Settings \ Application Data \ Company \ 5kAdCon.exe_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko \ 1.0.0.0。有没有一种构建此路径的方法? - John Myczek
程序如何知道它在哪里我知道您可以使用环境变量来查找用户名等信息。除非其余部分是静态的,否则我不知道惯例是什么。 - Crash893
1
没错,这就是我的问题。我不知道如何获取路径中的“_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko”部分。 - John Myczek
很明显,程序以某种方式知道。我怀疑这不是一个很优雅的做事方式,但你可以仅扫描下面的所有内容并仅在config.conf上进行过滤。 - Crash893

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接