using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; namespace ConfigMonitor { public class ConfigMonitor { private readonly FileSystemWatcher _watcher; private DateTime _lastChange; public ConfigMonitor(string configFilePath) { if (configFilePath == null) { throw new ArgumentNullException(nameof(configFilePath)); } _lastChange = DateTime.MinValue; //var configFile = string.Concat(System.Reflection.Assembly.GetEntryAssembly().Location, ".config"); if (File.Exists(configFilePath)) { _watcher = new FileSystemWatcher(Path.GetDirectoryName(configFilePath), Path.GetFileName(configFilePath)) { EnableRaisingEvents = true }; _watcher.Changed += Watcher_Changed; } } ~ConfigMonitor() { _watcher.EnableRaisingEvents = false; _watcher.Changed -= Watcher_Changed; _watcher.Dispose(); } public void Stop() { _watcher.EnableRaisingEvents = false; _watcher.Changed -= Watcher_Changed; _watcher.Dispose(); } private void Watcher_Changed(object sender, FileSystemEventArgs e) { if ((DateTime.Now - _lastChange).Seconds <= 5 || IsFileLocked(e.FullPath)) return; var monitoredSections = ConfigurationManager.AppSettings["monitoredSections"]; if (monitoredSections!= null) { IEnumerable sections = monitoredSections.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (sections.Any()) { foreach (var section in sections) { ConfigurationManager.RefreshSection(section); } } } else { ConfigurationManager.RefreshSection("appSettings"); } _lastChange = DateTime.Now; } private bool IsFileLocked(string filePath) { FileStream stream = null; try { stream = File.OpenRead(filePath); } catch (IOException) { return true; } finally { stream?.Close(); } return false; } } }