Как посмотреть файл user.config и перезагрузить настройки при его изменении? - PullRequest
3 голосов
/ 19 мая 2009

У меня есть ситуация, когда я запускаю несколько экземпляров своего приложения WPF. Я хочу, чтобы экземпляры использовали один и тот же файл user.config. В настоящее время тот экземпляр, который записывает в файл user.config, побеждает последним. Я бы предпочел, чтобы все экземпляры просматривали файл user.config и перезагружали настройки всякий раз, когда другой экземпляр изменяет его. Файл user.config в настоящее время находится здесь:

C: \ Documents and Settings \ имя пользователя \ Локальные настройки \ Данные приложения \ название компании \ ExeName .exe_StrongName_ хеш \ 1.0.0.0

Например, C: \ Documents and Settings \ имя_пользователя \ Локальные настройки \ Application Data \ Company \ 5kAdCon.exe_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko \ 1.0.0.0

Есть ли способ для меня получить этот полный путь (включая хэш), чтобы я мог добавить наблюдатель файла в файл user.config?

Если это так, я хочу перезагрузить настройки при изменении файла. Это так же просто, как вызвать этот метод?

Properties.Settings.Default.Reload();

Ответы [ 3 ]

6 голосов
/ 21 мая 2009

Я нашел это. Следующий код вернет путь к файлу user.config. Вам нужно добавить ссылку на System.Configuration.dll

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

Теперь я могу использовать FileSystemWatcher , чтобы получать уведомления при изменении файла.

1 голос
/ 20 мая 2009

Вам следует кэшировать файл и реализовать CacheDependency, чтобы при внесении каких-либо изменений в файл файл перезагружался в Cache. Я использую файл разрешения 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));
    }

Кэширование также увеличит производительность вашего приложения.

0 голосов
/ 20 мая 2009

не могли бы вы использовать элемент управления fileSystemWatcher?

имеет измененное событие, которое вы можете вызвать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...