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

StackOverflow https://stackoverflow.com/questions/884260

  •  22-08-2019
  •  | 
  •  

Pergunta

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 de usuário \ Local Settings \ Application Data \ nome da empresa \ exename .exe_StrongName_ de hash \ 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 o arquivo muda. É tão fácil como chamar esse método?

Properties.Settings.Default.Reload();
Foi útil?

Solução

Eu encontrei-o. 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 obter notificado quando o arquivo for alterado.

Outras dicas

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.

Você pode usar o controle FileSystemWatcher?

tem um evento modificado pode desencadear

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top