Como posso assistir o arquivo user.config e recarregar as configurações quando muda?
-
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();
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