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