/// <summary> /// This function initializes the monitor by obtaining the current state and then creating and /// starting the monitor in a background thread, /// </summary> public void EnableMonitoring() { if (this.Path.Equals(String.Empty)) return; initialSnapshot = GetFolderSnapshot(); bckrndWorkerMonitor = new BackgroundWorker(); bckrndWorkerMonitor.WorkerSupportsCancellation = true; bckrndWorkerMonitor.DoWork += new DoWorkEventHandler(onMonitorEvent); bckrndWorkerMonitor.RunWorkerAsync(); log.Info("Background file watcher monitor process started."); }
/// <summary> /// This function returns a current snapshot of the contents of the folder with /// a timestamp showing when the snapshot was taken. /// </summary> /// <returns>snaphot of folder</returns> private DirectorySnapshot GetFolderSnapshot() { DirectorySnapshot snaphot = null; if (Directory.Exists(this.Path)) { snaphot = new DirectorySnapshot(this.Path); foreach (string file in Directory.GetFiles(this.Path, this.Filter)) snaphot.FileList[file] = File.GetCreationTime(file); snaphot.tsRefreshed = DateTime.Now; } return snaphot; }
/// <summary> /// This function compares two DirectorySnapshot objects and returns a list of newly added files /// </summary> /// <param name="initialSnapshot"></param> /// <param name="currentSnapshot"></param> /// <returns>List of new files</returns> private List<string> CompareSnaphots(DirectorySnapshot initialSnapshot, DirectorySnapshot currentSnapshot) { List<string> newFiles = new List<string>(); if (initialSnapshot == null || currentSnapshot == null) { log.WarnFormat("FileSystemWatcherEnhanced cannot compare snapshots if snapshot is null."); return newFiles; } lock (initialSnapshot) { lock (currentSnapshot) { foreach (string file in currentSnapshot.FileList.Keys) if (!initialSnapshot.FileList.ContainsKey(file)) newFiles.Add(file); } } return newFiles; }
private void CheckForNewFiles() { //obtain current folder state currentSnapshot = GetFolderSnapshot(); //compare current and initial states to determine new (i.e. unprocessed) files //Debug.Assert(initialSnapshot != null); //Debug.Assert(currentSnapshot != null); List<string> newFiles = CompareSnaphots(initialSnapshot, currentSnapshot); if (newFiles.Count > 0) log.InfoFormat("FileSystemWatcherEnhanced monitor found {0} files in {1}", newFiles.Count, this.Path); foreach (string file in newFiles) { log.WarnFormat("FileSystemWatcher monitor found an unprocessed file. Launching delegate to process {0}", file); fileReceivedHandler.Invoke(this, new FileSystemEventArgs(WatcherChangeTypes.Created, this.Path, file.Replace(this.Path, "").TrimStart('\\'))); } /// Reset network connection, if dropped if (!EnableRaisingEvents) EnableRaisingEvents = true; /// Reset the "initialState" after a certain period (typically daily) to help ensure we dont get a memory overflow if (initialSnapshot.tsRefreshed.AddMinutes(initialStateRefreshIntervalMins) < DateTime.Now) initialSnapshot = GetFolderSnapshot(); }