示例#1
0
        public IEnumerable <File> FilesInDirectory(string directory, Watcher watcher)
        {
            var files = Files.FromSqlRaw(
                "SELECT * FROM Files WHERE WatcherId == {0} AND (Directory == {1} OR Directory GLOB {2})",
                watcher.Id,
                directory,
                directory + Path.DirectorySeparatorChar + '*'
                ).ToList();

            return(from file in files
                   where DBHelpers.IsInDir(new DirectoryInfo(file.Directory), directory)
                   select file);
        }
示例#2
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);
        }
示例#3
0
        public void RenameFilesInDirectory(string oldPath, string newPath, Watcher watcher)
        {
            var filesInOldPath = FilesInDirectory(oldPath, watcher);

            foreach (File file in filesInOldPath)
            {
                var      newFullName = newPath + Path.DirectorySeparatorChar + DBHelpers.GetRelativePathFromFile(file.FullName, oldPath);
                FileInfo newInfo     = new FileInfo(newFullName);
                file.FullName      = newInfo.FullName;
                file.Directory     = newInfo.DirectoryName;
                file.Directory_fts = DBHelpers.TokenizeDirectory(newInfo, watcher);
            }
            SaveChanges();
        }
示例#4
0
        private static byte[] MaybeMakeThumbnail(FileInfo file, Watcher watcher)
        {
            _log.Info($"Generating thumbnail for file {file.FullName}.");

            if (Helpers.IsImageFile(file.FullName))
            {
                return(DBHelpers.GetThumbnail(file));
            }
            else if (Helpers.IsVideoFile(file.FullName) && videoThumbnailExtractor != null && watcher.GenerateVideoThumbnails.GetValueOrDefault())
            {
                Console.WriteLine($"Generating video thumbnail for file {file.Name}.");
                return(DBHelpers.GetThumbnail(file, videoThumbnailExtractor));
            }
            return(null);
        }
示例#5
0
        private static File MakeFileModel(FileInfo fileInfo, Watcher watcher)
        {
            File newFile = new File
            {
                FullName           = fileInfo.FullName,
                Directory          = fileInfo.DirectoryName,
                Name               = fileInfo.Name,
                FileCreatedTime    = fileInfo.CreationTimeUtc,
                FileModifiedTime   = fileInfo.LastWriteTimeUtc,
                LastChangeTime     = Helpers.LastChangeTime(fileInfo),
                Extension          = fileInfo.Extension,
                Directory_fts      = DBHelpers.TokenizeDirectory(fileInfo, watcher),
                Name_fts           = fileInfo.Name,
                Name_tokenized_fts = DBHelpers.TokenizeName(fileInfo),
                Extension_fts      = fileInfo.Extension.Trim('.'),
                WatcherId          = watcher.Id
            };

            // Fix these when they actually get exceptions.
            newFile.Thumbnail = MaybeMakeThumbnail(fileInfo, watcher);
            updateXMPTagsFromFile(newFile);
            return(newFile);
        }