private static FileSystemEvent CreateFileSystemEvent(LogRecord record, string[] strings) { var fileSystemEvent = new FileSystemEvent() { Filename = PathConverter.ReplaceDevicePath(strings[0]), ProcessId = record.Data.ProcessId, Type = record.Data.EventType }; return fileSystemEvent; }
private void PostponeEventDelivery(FileSystemEvent fileEvent) { if (!postponedEvents.ContainsKey(fileEvent.Filename)) { postponedEvents.Add(fileEvent.Filename, fileEvent); } }
private void HandleFileEvent(FileSystemEvent fileEvent) { if (fileEvent.Type == EventType.Close) { FlushPostponedEvents(fileEvent); } else if (CanBePostponed(fileEvent) && AggregateEvents) { PostponeEventDelivery(fileEvent); } else if (!EventShouldBeIgnored(fileEvent)) { DeliverEvent(fileEvent, AggregateEvents); } }
private void FlushPostponedEvents(FileSystemEvent fileEvent) { if (postponedEvents.ContainsKey(fileEvent.Filename)) { var postponedEvent = postponedEvents[fileEvent.Filename]; postponedEvents.Remove(fileEvent.Filename); DeliverEvent(postponedEvent, false); } }
private bool EventShouldBeIgnored(FileSystemEvent fileEvent) { if (fileEvent is RenameOrMoveEvent) { return fileEvent.Filename.StartsWith(RECYCLE_BIN_PREFIX, StringComparison.CurrentCultureIgnoreCase); } return false; }
private void DeliverEvent(FileSystemEvent fileEvent, bool postponeDelivery) { switch (fileEvent.Type) { case EventType.Change: OnChange?.Invoke(fileEvent.Filename, fileEvent.ProcessId); break; case EventType.Create: OnCreate?.Invoke(fileEvent.Filename, fileEvent.ProcessId); break; case EventType.Delete: OnDelete?.Invoke(fileEvent.Filename, fileEvent.ProcessId); break; case EventType.Move: OnRenameOrMove?.Invoke(fileEvent.Filename, ((RenameOrMoveEvent) fileEvent).OldFilename, fileEvent.ProcessId); break; default: break; } }
private bool CanBePostponed(FileSystemEvent fileEvent) { return fileEvent.Type == EventType.Change || fileEvent.Type == EventType.Create; }