示例#1
0
        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);
        }