Wie kann ich die user.config Datei beobachten und die Einstellungen neu zu laden, wenn sie sich ändert?

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

  •  22-08-2019
  •  | 
  •  

Frage

Ich habe eine Situation, wo ich mehrere Instanzen von meiner WPF-Anwendung leite. Ich möchte die Instanzen die gleiche user.config Datei teilen. Derzeit je nachdem, welche Instanz schreibt in die user.config Datei zuletzt gewinnt. Ich würde es vorziehen, für alle Instanzen der user.config Datei und laden Sie die Einstellungen zu sehen, wenn eine andere Instanz ändert. Die user.config Datei ist zur Zeit hier zu finden:

C: \ Dokumente und Einstellungen \ Benutzername \ Lokale Einstellungen \ Anwendungsdaten \ Firmenname \ ExeName .exe_StrongName_ Hash \ 1.0.0.0

Zum Beispiel C: \ Dokumente und Einstellungen \ usename \ Lokale Einstellungen \ Anwendungsdaten \ Unternehmen \ 5kAdCon.exe_StrongName_gxh0g12uyafipnfrslaggvy4vvk01fko \ 1.0.0.0

Gibt es eine Möglichkeit für mich, diesen vollständigen Pfad zu erhalten (einschließlich des Hash), so kann ich eine Datei-Watcher auf die user.config Datei hinzufügen?

Wenn ja, möchte ich die Einstellungen, wenn die Dateiänderungen neu zu laden. Ist es so einfach wie das Aufrufen dieser Methode?

Properties.Settings.Default.Reload();
War es hilfreich?

Lösung

Ich habe es gefunden. Der folgende Code wird den Pfad zur user.config Datei zurück. Sie müssen einen Verweis auf System.Configuration.dll

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

Jetzt kann ich einen Filesystemwatcher zu erhalten benachrichtigt, wenn die Datei geändert wird.

Andere Tipps

Sie sollten die Datei-Cache und CacheDependency implementieren, so dass, wenn eine Änderung an der Datei wird die Datei in den Cache geladen wird. Ich verwende eine Erlaubnis XML-Datei in meiner Anwendung, die im Cache gespeichert wird und neu geladen, wenn die Datei geändert wird. Hier ist der Code:

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 wird auch Ihre Anwendungsleistung erhöhen.

können Sie verwenden, um die Filesystemwatcher Kontrolle?

es hat eine modifizierte Ereignis, das Sie auslösen können,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top