Как я могу посмотреть файл user.config и перезагрузить настройки при его изменении?

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

C: \ Documents and Settings \ имя пользователя \ Local Settings \ Application Data \ название компании \ ExeName .exe_StrongName_ hash \ 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();

person John Myczek    schedule 19.05.2009    source источник
comment
Вы в порядке, если несохраненные настройки одного экземпляра перезаписываются другим экземпляром? Мне кажется, пользователь не ожидал, что все настройки будут сброшены. По крайней мере, поднимите для этого диалог.   -  person Szymon Rozga    schedule 20.05.2009
comment
Для большей части, да. Я стараюсь не иметь значения, какой экземпляр закрывается последним. Прямо сейчас настройки для последнего закрытого экземпляра - это те, которые сохраняются.   -  person John Myczek    schedule 20.05.2009


Ответы (3)


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

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

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

person John Myczek    schedule 21.05.2009

Вам следует кэшировать файл и реализовать 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));
    }

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

person SO User    schedule 20.05.2009
comment
Что-то подобное может сработать, но моя самая большая проблема в том, что я не знаю путь к файлу user.config. Я использую встроенные настройки приложения (msdn.microsoft.com/en- us / library / a65txexh.aspx) и не знаю, как построить путь, выбранный MS для каталога user.config. Это выглядит так: C: \ Documents and Settings \ usename \ Local Settings \ Application Data \ Company \ 5kAdCon.exe_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko \ 1.0.0.0 - person John Myczek; 20.05.2009

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

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

person Crash893    schedule 19.05.2009
comment
Да, но я не знаю, как получить путь к файлу, который мне нужно посмотреть. Путь выглядит так: C: \ Documents and Settings \ usename \ Local Settings \ Application Data \ Company \ 5kAdCon.exe_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko \ 1.0.0.0. Есть ли способ построить этот путь? - person John Myczek; 20.05.2009
comment
как программа узнает, где это, я знаю, что вы можете использовать переменные среды, чтобы найти имя пользователя, а что нет. если все остальное не статично, я не знаю, в чем заключается соглашение. - person Crash893; 20.05.2009
comment
Хорошо, это моя проблема. Я не знаю, как получить часть пути _StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko. - person John Myczek; 20.05.2009
comment
ну, очевидно, программа каким-то образом знает, что я сомневаюсь, что это был бы очень эффективный способ делать что-то, но вы могли бы просто сканировать все под и фильтровать только на config.conf - person Crash893; 20.05.2009