public bool Sync(Watcher watcher, bool updateThumbnails = true) { bool changed = false; var filesInDir = DBHelpers.GetAllFileInfo(watcher); if (filesInDir == null) { return(false); } // Remove files no longer in folder. var toRemove = from file in GetAllFilesInWatcher(watcher).ToList() where !filesInDir.ContainsKey(file.FullName) select file; changed |= toRemove.Any(); Files.RemoveRange(toRemove); // Update updated files. // Tuples returned are of the form (Modified Time, Created Time) var toUpdate = from file in GetAllFilesInWatcher(watcher).ToList() where filesInDir.ContainsKey(file.FullName) && (!filesInDir[file.FullName].Item1.Equals(file.FileModifiedTime) || !filesInDir[file.FullName].Item2.Equals(file.FileCreatedTime)) select file; changed |= toUpdate.Any(); foreach (var file in toUpdate) { file.FileModifiedTime = filesInDir[file.FullName].Item1; file.FileCreatedTime = filesInDir[file.FullName].Item2; if (updateThumbnails) { file.Thumbnail = MaybeMakeThumbnail(new FileInfo(file.FullName), watcher); } updateXMPTagsFromFile(file); } // Add files that are new. foreach (var file in GetAllFilesInWatcher(watcher)) { filesInDir.Remove(file.FullName); } Console.WriteLine($"Adding {filesInDir.Count()} files during sync."); var toAdd = from filename in filesInDir.Keys select MakeFileModel(new FileInfo(filename), watcher); changed |= toAdd.Any(); Files.AddRange(toAdd); SaveChanges(); return(changed); }