Como posso assistir o arquivo user.config e recarregar as configurações quando muda?

votos
3

Eu tenho uma situação onde eu estou executando várias instâncias do meu aplicativo WPF. Quero que as instâncias para compartilhar o mesmo arquivo user.config. Atualmente, qualquer instância escreve para o arquivo user.config últimas vitórias. Eu prefiro para todas as instâncias para assistir o arquivo user.config e recarregar as configurações sempre que outra instância muda-lo. O arquivo user.config está localizado aqui:

C: \ Documents and Settings \ nome do usuário \ Local Settings \ Application Data \ nome da empresa \ exename .exe_StrongName_ hash de \ 1.0.0.0

Por exemplo, C: \ Documents and Settings \ usename \ Local Settings \ Application Data \ Empresa \ 5kAdCon.exe_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko \ 1.0.0.0

Existe uma maneira para eu conseguir esse caminho completo (incluindo o hash) para que eu possa adicionar um observador de arquivo para o arquivo user.config?

Se assim for, eu quero recarregar as configurações quando as mudanças de arquivo. É tão fácil como chamar esse método?

Properties.Settings.Default.Reload();
Publicado 19/05/2009 em 19:11
fonte usuário
Em outras línguas...                            


3 respostas

votos
6

Eu encontrei. O código a seguir irá retornar o caminho para o arquivo user.config. Você precisa adicionar uma referência para System.Configuration.dll

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

Agora eu posso usar um FileSystemWatcher para ser notificado quando o arquivo for alterado.

Respondeu 21/05/2009 em 20:59
fonte usuário

votos
1

Você deve armazenar em cache o arquivo e implementar CacheDependency de modo que se qualquer alteração é feita para o arquivo o arquivo é recarregado na Cache. Eu estou usando um arquivo xml permissão no meu aplicativo que fica armazenado no cache e recarregada se o arquivo é alterado. Aqui está o código:

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));
    }

Caching também irá aumentar o desempenho do aplicativo.

Respondeu 20/05/2009 em 05:52
fonte usuário

votos
0

você poderia usar o controle FileSystemWatcher?

Tem um evento modificado pode provocar

Respondeu 19/05/2009 em 21:38
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more