/// <summary> /// Get the change queue. /// </summary> public Queue <WatcherEvent> GetChangeQueue() { lock (changeLock) { Queue <WatcherEvent> changeQueue = new Queue <WatcherEvent>(); int changeListCount = changeList.Count; for (int i = 0; i < changeListCount; i++) { WatcherEvent watcherEvent = changeList[i]; FileSystemEventArgs change = watcherEvent.GetFileSystemEventArgs(); string fileName = System.IO.Path.GetFileName(change.FullPath); string dirName = System.IO.Path.GetDirectoryName(change.FullPath); bool redundantChange = false; if (change.ChangeType == WatcherChangeTypes.Deleted) { //Detect a file/folder move... FileSystemEventArgs nextChange = ((i + 1) < changeListCount) ? changeList[i + 1].GetFileSystemEventArgs() : null; if (nextChange != null) { string nextFileName = System.IO.Path.GetFileName(nextChange.FullPath); string nextDirName = System.IO.Path.GetDirectoryName(nextChange.FullPath); if (nextChange.ChangeType == WatcherChangeTypes.Created && nextFileName.Equals(fileName) && !nextDirName.Equals(dirName)) { //Move detected... change = new MovedEventArgs(WatcherChangeTypes.Renamed, dirName, nextDirName, fileName); ++i; //Skip nextChange } } } else if (change.ChangeType == WatcherChangeTypes.Changed) { //Detect redundant changes... for (int j = i - 1; j >= 0; j--) { //Iterate backwards through the list of changes, find the most recent operation on this specific file if (change.FullPath.Equals(changeList[j].GetFileSystemEventArgs().FullPath)) { //If the most recent operation is a created or changed operation this operation is redundant if (changeList[j].GetFileSystemEventArgs().ChangeType == WatcherChangeTypes.Created || changeList[j].GetFileSystemEventArgs().ChangeType == WatcherChangeTypes.Changed) { redundantChange = true; } break; } } } if (redundantChange) { Logger.DebugFormat("Local file change {0} discarded because redundant", change.ChangeType); } else { changeQueue.Enqueue(watcherEvent); } } return(changeQueue); } }