/// <summary> /// Enqueue event and wait to be dispatched. /// </summary> /// <param name="e">A <see cref="Syncless.Monitor.DTO.FileSystemEvent"/> object containing the information needed to handle a request.</param> public void Enqueue(FileSystemEvent e) { lock (queue) { queue.Enqueue(e); } if (dispatcherThread == null) // start the thread if not started { dispatcherThread = new Thread(DispatchEvent); dispatcherThread.Start(); } else if (dispatcherThread.ThreadState == ThreadState.WaitSleepJoin) // wake the thread if sleeped { waitHandle.Set(); } }
private void ExecuteFile(FileSystemEvent fse) { FileChangeEvent fileEvent; switch (fse.EventType) { case EventChangeType.CREATED: //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("File Created: " + fse.Path); fileEvent = new FileChangeEvent(new FileInfo(fse.Path), EventChangeType.CREATED); ServiceLocator.MonitorI.HandleFileChange(fileEvent); break; case EventChangeType.MODIFIED: //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("File Modified: " + fse.Path); fileEvent = new FileChangeEvent(new FileInfo(fse.Path), EventChangeType.MODIFIED); ServiceLocator.MonitorI.HandleFileChange(fileEvent); break; case EventChangeType.DELETED: //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("File Deleted: " + fse.Path); fileEvent = new FileChangeEvent(new FileInfo(fse.Path), EventChangeType.DELETED); ServiceLocator.MonitorI.HandleFileChange(fileEvent); break; case EventChangeType.RENAMED: //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("File Renamed: " + fse.OldPath + " " + fse.Path); fileEvent = new FileChangeEvent(new FileInfo(fse.OldPath), new FileInfo(fse.Path)); ServiceLocator.MonitorI.HandleFileChange(fileEvent); break; default: Debug.Assert(false); break; } }
private void ProcessUnknown(FileSystemEvent fse, List<FileSystemEvent> eventList) { switch (fse.EventType) { case EventChangeType.CREATED: processList.Add(fse); break; case EventChangeType.DELETED: GenericDeleted(fse); break; case EventChangeType.RENAMED: GenericRenamed(fse, eventList); break; default: Debug.Assert(false); break; } }
private void RenamedHasCreating(FileSystemEvent fse, List<FileSystemEvent> eventList, ref bool hasCreating, ref bool foundCreated) { for (int i = 0; i < creatingList.Count; i++) // wait for the created event if a creating event exist { string path = creatingList[i]; if (path.ToLower().Equals(fse.OldPath.ToLower())) // still creating { hasCreating = true; for (int j = 0; j < eventList.Count; j++) // look for the created event { FileSystemEvent e = eventList[j]; if (e.Path.ToLower().Equals(fse.OldPath.ToLower()) && e.EventType == EventChangeType.CREATED && e.FileSystemType == FileSystemType.FILE) { ProcessFile(e, eventList); // process the created event first eventList.RemoveAt(j); foundCreated = true; break; } } } } }
private void GenericRenamed(FileSystemEvent fse, List<FileSystemEvent> eventList) { bool hasCreating = false; bool foundCreated = false; if (fse.FileSystemType != FileSystemType.FOLDER) // does not apply if is a folder { RenamedHasCreating(fse, eventList, ref hasCreating, ref foundCreated); // wait for the created event if a creating event exist } bool addRenamed = true; for (int i = 0; i < processList.Count; i++) { FileSystemEvent pEvent = processList[i]; if (pEvent.Path.ToLower().Equals(fse.OldPath.ToLower())) // remove any existing event if exist { processList.RemoveAt(i); i--; if (pEvent.EventType == EventChangeType.CREATED) // if is created event, transform it to a create event with the new path name { addRenamed = false; processList.Add(new FileSystemEvent(fse.Path, EventChangeType.CREATED, fse.FileSystemType)); } else if (pEvent.EventType == EventChangeType.RENAMED) // if is renamed event, transform it to a renamed event with the new old path name and new path name { addRenamed = false; processList.Add(new FileSystemEvent(pEvent.OldPath, fse.Path, fse.FileSystemType)); } } } if (addRenamed) { processList.Add(fse); } if (fse.FileSystemType != FileSystemType.FOLDER) // does not apply if is a folder { if (hasCreating && !foundCreated) // put all remainding events into waiting list if the created event is not found { waitingList = new List<FileSystemEvent>(eventList); eventList.Clear(); } } }
private bool DeletedHasCreating(FileSystemEvent fse) { for (int i = 0; i < creatingList.Count; i++) // ignore this event if it is still creating { string path = creatingList[i]; if (path.ToLower().Equals(fse.Path.ToLower())) { creatingList.RemoveAt(i); // file is deleted so no need to wait for the created event return false; } } return true; }
private void GenericDeleted(FileSystemEvent fse) { bool addDeleted = true; if (fse.FileSystemType != FileSystemType.FOLDER) // does not apply if is a folder { addDeleted = DeletedHasCreating(fse); // ignore this event if it is still creating } for (int i = 0; i < processList.Count; i++) { FileSystemEvent pEvent = processList[i]; if (pEvent.Path.ToLower().Equals(fse.Path.ToLower())) // remove any existing event if exist { processList.RemoveAt(i); i--; // "creation" (renamed is also a form of creation) is found so there is not a need to execute this event if (pEvent.EventType == EventChangeType.CREATED || pEvent.EventType == EventChangeType.RENAMED) { addDeleted = false; } } if (pEvent.EventType == EventChangeType.DELETED) // remove all child deleted event so only the root path will be executed { FileInfo child = new FileInfo(pEvent.Path); DirectoryInfo parent = new DirectoryInfo(fse.Path); if (child.Directory.FullName.ToLower().Equals(parent.FullName.ToLower())) { processList.RemoveAt(i); i--; } } } if (addDeleted) { processList.Add(fse); } }
// execute when a deleted event is fired private void OnDeleted(object source, FileSystemEventArgs e) { if (!filtering.ApplyFilter(filterList, e.FullPath)) { return; } ExtendedFileSystemWatcher watcher = (ExtendedFileSystemWatcher)source; FileSystemEvent fse = new FileSystemEvent(e.FullPath, watcher.Path); FileSystemEventDispatcher.Instance.Enqueue(fse); }
private void FileCreated(FileSystemEvent fse) { for (int i = 0; i < creatingList.Count; i++) // remove from the creating list since it is created. { string path = creatingList[i]; if (path.ToLower().Equals(fse.Path.ToLower())) { creatingList.RemoveAt(i); processList.Add(fse); return; } } }
private void ProcessFile(FileSystemEvent fse, List<FileSystemEvent> eventList) { switch (fse.EventType) { case EventChangeType.CREATING: creatingList.Add(fse.Path); break; case EventChangeType.CREATED: FileCreated(fse); break; case EventChangeType.MODIFIED: if (!FileModified(fse)) return; break; case EventChangeType.DELETED: GenericDeleted(fse); break; case EventChangeType.RENAMED: GenericRenamed(fse, eventList); break; default: Debug.Assert(false); break; } }
// execute when a renamed event for root watcher is fired private void OnRootRenamed(object source, RenamedEventArgs e) { if (!filtering.ApplyFilter(filterList, e.OldFullPath)) { return; } FileSystemWatcher watcher = (FileSystemWatcher)source; List<string> folders = rootsAndParent[watcher.Path]; foreach (string folder in folders) { if (e.OldFullPath.Equals(folder)) { FileSystemEvent fse = new FileSystemEvent(e.OldFullPath, e.FullPath, FileSystemType.FOLDER); FileSystemEventDispatcher.Instance.Enqueue(fse); return; } } }
// execute when a create completed event is fired private void OnCreateComplete(object source, FileSystemEventArgs e) { if (!filtering.ApplyFilter(filterList, e.FullPath)) { return; } FileSystemEvent fse = new FileSystemEvent(e.FullPath, EventChangeType.CREATED, FileSystemType.FILE); FileSystemEventDispatcher.Instance.Enqueue(fse); }
// execute when a renamed event is fired private void OnRenamed(object source, RenamedEventArgs e) { if (!filtering.ApplyFilter(filterList, e.OldFullPath)) { return; } FileSystemEvent fse; if (File.Exists(e.FullPath)) { fse = new FileSystemEvent(e.OldFullPath, e.FullPath, FileSystemType.FILE); } else if (Directory.Exists(e.FullPath)) { fse = new FileSystemEvent(e.OldFullPath, e.FullPath, FileSystemType.FOLDER); } else { fse = new FileSystemEvent(e.OldFullPath, e.FullPath, FileSystemType.UNKNOWN); } FileSystemEventDispatcher.Instance.Enqueue(fse); }
private void ExecuteFolder(FileSystemEvent fse) { FolderChangeEvent folderEvent; switch (fse.EventType) { case EventChangeType.CREATED: //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("Folder Created: " + fse.Path); folderEvent = new FolderChangeEvent(new DirectoryInfo(fse.Path), EventChangeType.CREATED); ServiceLocator.MonitorI.HandleFolderChange(folderEvent); break; case EventChangeType.DELETED: //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("Folder Deleted: " + fse.Path); folderEvent = new FolderChangeEvent(new DirectoryInfo(fse.Path), EventChangeType.DELETED); ServiceLocator.MonitorI.HandleFolderChange(folderEvent); break; case EventChangeType.RENAMED: //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("Folder Renamed: " + fse.OldPath + " " + fse.Path); folderEvent = new FolderChangeEvent(new DirectoryInfo(fse.OldPath), new DirectoryInfo(fse.Path)); ServiceLocator.MonitorI.HandleFolderChange(folderEvent); break; default: Debug.Assert(false); break; } }
private bool FileModified(FileSystemEvent fse) { foreach (string path in creatingList) // ignore this event if it is still creating { if (path.ToLower().Equals(fse.Path.ToLower())) { return false; } } bool addModified = true; for (int i = 0; i < processList.Count; i++) { FileSystemEvent pEvent = processList[i]; if (pEvent.Path.ToLower().Equals(fse.Path.ToLower())) // ignore this event if there exist any event for this path { addModified = false; break; } else if (pEvent.EventType == EventChangeType.RENAMED) // ignore this event if a path is renamed { if (pEvent.OldPath.ToLower().Equals(fse.Path.ToLower()) && pEvent.FileSystemType == fse.FileSystemType) { addModified = false; break; } } } if (addModified) { processList.Add(fse); } return true; }
private void ExecuteUnknown(FileSystemEvent fse) { switch (fse.EventType) { case EventChangeType.DELETED: //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("File/Folder Deleted: " + fse.Path); DeleteChangeEvent deleteEvent = new DeleteChangeEvent(new DirectoryInfo(fse.Path), new DirectoryInfo(fse.WatchPath)); ServiceLocator.MonitorI.HandleDeleteChange(deleteEvent); break; default: Debug.Assert(false); break; } }
// execute when a modified event is fired private void OnModified(object source, FileSystemEventArgs e) { if (!filtering.ApplyFilter(filterList, e.FullPath)) { return; } if (File.Exists(e.FullPath)) { FileSystemEvent fse = new FileSystemEvent(e.FullPath, EventChangeType.MODIFIED, FileSystemType.FILE); FileSystemEventDispatcher.Instance.Enqueue(fse); } }