Как я могу просмотреть файл user.config и перезагрузить настройки при его изменении?
-
22-08-2019 - |
Вопрос
У меня есть ситуация, когда я запускаю несколько экземпляров своего приложения WPF.Я хочу, чтобы экземпляры использовали один и тот же файл user.config.В настоящее время побеждает тот экземпляр, который последним запишет файл user.config.Я бы предпочел, чтобы все экземпляры просматривали файл user.config и перезагружали настройки всякий раз, когда другой экземпляр меняет их.Файл user.config в настоящее время находится здесь:
C:\Документы и настройки\имя пользователя\Локальные настройки\Данные приложения\Название компании\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();
Решение
Я нашел это.Следующий код вернет путь к файлу user.config.Вам необходимо добавить ссылку на System.Configuration.dll.
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
string path = config.FilePath;
Теперь я могу использовать FileSystemWatcher чтобы получать уведомления при изменении файла.
Другие советы
Вам следует кэшировать файл и реализовать 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));
}
Кэширование также повысит производительность вашего приложения.
не могли бы вы использовать элемент управления fileSystemWatcher?
у него есть измененное событие, которое вы можете вызвать