private void PopEventsFromList() {
try {
lock (this.listLock) {
this.timer.Stop();
if (this.events.Count == 0) {
return;
}
while (this.events.Count > 0 && (DateTime.UtcNow - this.events[0].Item3).Milliseconds >= this.threshold) {
var entry = this.events[0];
this.events.RemoveAt(0);
if (entry.Item1.ChangeType == WatcherChangeTypes.Created) {
IFileSystemInfo fsInfo = entry.Item4 ? (IFileSystemInfo)this.fsFactory.CreateDirectoryInfo(entry.Item1.FullPath) : (IFileSystemInfo)this.fsFactory.CreateFileInfo(entry.Item1.FullPath);
try {
Guid? fsUuid = fsInfo.Uuid;
if (fsUuid != null && fsUuid != Guid.Empty) {
var correspondingDeletion = this.events.Find((Tuple<FileSystemEventArgs, Guid, DateTime, bool> obj) => obj.Item2 == (Guid)fsUuid && obj.Item1.ChangeType == WatcherChangeTypes.Deleted);
if (correspondingDeletion != null) {
this.queue.AddEvent(new FSMovedEvent(correspondingDeletion.Item1.FullPath, entry.Item1.FullPath, entry.Item4));
this.events.Remove(correspondingDeletion);
continue;
}
}
} catch (ExtendedAttributeException) {
} catch (FileNotFoundException) {
continue;
} catch (DirectoryNotFoundException) {
continue;
}
} else if (entry.Item1.ChangeType == WatcherChangeTypes.Deleted && entry.Item2 != Guid.Empty) {
var correspondingCreation = this.events.Find((Tuple<FileSystemEventArgs, Guid, DateTime, bool> obj) => obj.Item2 == entry.Item2 && obj.Item1.ChangeType == WatcherChangeTypes.Created);
if (correspondingCreation != null) {
this.queue.AddEvent(new FSMovedEvent(entry.Item1.FullPath, correspondingCreation.Item1.FullPath, entry.Item4));
this.events.Remove(correspondingCreation);
continue;
}
}
this.queue.AddEvent(new FSEvent(entry.Item1.ChangeType, entry.Item1.FullPath, entry.Item4));
}
if (this.events.Count > 0) {
this.ResetTimerInterval();
this.timer.Start();
}
}
} catch (Exception ex) {
Logger.Warn(string.Format("Pop file system event produces exception => force crawl sync"), ex);
this.queue.AddEvent(new StartNextSyncEvent(true));
}
}
}