private void AddPath(WatcherConfiguration watcherConfiguration)
        {
            if (watcherConfiguration == null)
            {
                throw new ArgumentNullException("watcherConfiguration");
            }


            try
            {
                FileSystemWatcher watcher;

                string path;
                string filter;
                if (File.Exists(watcherConfiguration.Path))
                {
                    path = Path.GetDirectoryName(watcherConfiguration.Path);
                    Debug.Assert(path != null);
                    filter = Path.GetFileName(watcherConfiguration.Path);
                }
                else if (Directory.Exists(watcherConfiguration.Path))
                {
                    path   = watcherConfiguration.Path;
                    filter = watcherConfiguration.Filter;
                }
                else
                {
                    Logger.Log(new FileEventArgs()
                    {
                        ChangeType = WatcherChangeTypes.Deleted, Date = DateTime.Now, FullPath = watcherConfiguration.Path
                    });
                    return;
                }


                if (string.IsNullOrWhiteSpace(filter))
                {
                    watcher = new FileSystemWatcher(path);
                }
                else
                {
                    watcher = new FileSystemWatcher(path, filter);
                }

                watcher.IncludeSubdirectories = watcherConfiguration.IncludeSubdirectories;

                watcher.Changed            += Watcher_Changed;
                watcher.Created            += Watcher_Changed;
                watcher.Deleted            += Watcher_Changed;
                watcher.Error              += Watcher_Error;
                watcher.Renamed            += Watcher_Renamed;
                watcher.NotifyFilter        = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;
                watcher.EnableRaisingEvents = true;
                _watchers.Add(watcher);
            }
            catch (IOException ex)
            {
                Logger.Log(ex);
            }
            catch (Exception ex)
            {
                Logger.Log(ex);
            }
        }
        public void Load(bool lockConfigurationFile)
        {
            try
            {
                _stream = new FileStream(GetConfigurationPath(), FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.SequentialScan);

                XmlDocument doc = new XmlDocument();
                doc.Load(_stream);
                X509Certificate2 certificate = null;
                if (XmlHelpers.HasSignature(doc) && !XmlHelpers.VerifySignature(doc, out certificate))
                {
                    throw new Exception("Invalid Signature");
                }

                // Find Certificate
                if (certificate != null)
                {
                    X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
                    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

                    try
                    {
                        X509Certificate2           x509Certificate2           = new X509Certificate2(certificate);
                        X509Certificate2Collection x509Certificate2Collection = store.Certificates.Find(X509FindType.FindByThumbprint, x509Certificate2.Thumbprint, false);
                        foreach (X509Certificate2 certificate2 in x509Certificate2Collection)
                        {
                            Certificate = certificate2;
                            break;
                        }
                    }
                    finally
                    {
                        store.Close();
                    }
                }

                var xmlNodeList = doc.SelectNodes("//Watcher");
                foreach (XmlNode node in xmlNodeList)
                {
                    WatcherConfiguration watcherConfiguration = new WatcherConfiguration();
                    watcherConfiguration.Path   = XmlUtilities.GetAttribute(node, "path", (string)null);
                    watcherConfiguration.Filter = XmlUtilities.GetAttribute(node, "filter", (string)null);
                    watcherConfiguration.IncludeSubdirectories = XmlUtilities.GetAttribute(node, "includeSubdirectories", false);
                    var md5 = XmlUtilities.GetAttribute(node, "md5", (string)null);
                    if (md5 != null)
                    {
                        watcherConfiguration.Md5 = Convert.FromBase64String(md5);
                    }
                    var sha1 = XmlUtilities.GetAttribute(node, "sha1", (string)null);
                    if (sha1 != null)
                    {
                        watcherConfiguration.Sha1 = Convert.FromBase64String(sha1);
                    }
                    Watchers.Add(watcherConfiguration);
                }
            }
            finally
            {
                if (!lockConfigurationFile && _stream != null)
                {
                    _stream.Dispose();
                    _stream = null;
                }
            }
        }