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;
 }