public File GetFile(BackupDbEntities db, string path, Directory directory) { var file = db.Files.FirstOrDefault(fi => fi.FullPath == path); if (file == null) { var crc = GetCrc(path); var fi = new FileInfo(path); StatusFlag status = StatusFlag.Unchanged; //if (fi.LastWriteTime < _30hoursAgo) status = StatusFlag.Changed; file = new File { FullPath = path, IsNew = (long)status, Name = fi.Name, Crc = crc, DirectoryId = directory.Id, LastWriteTime = fi.LastWriteTime.Ticks }; db.Files.Add(file); } else { CheckFileDiff(db, file); } return(file); }
public void CleanDatabase() { using (var db = new BackupDbEntities()) { var files = db.Files.ToList(); db.Files.RemoveRange(files); db.SaveChanges(); var directories = db.Directories.ToList(); db.Directories.RemoveRange(directories); db.SaveChanges(); } }
private void CheckFileDiff(BackupDbEntities db, File file) { var fileInfo = new FileInfo(file.FullPath); if (file.LastWriteTime != fileInfo.LastWriteTime.Ticks) { var crc = GetCrc(file.FullPath); if (crc != file.Crc) { file.IsNew = (long)StatusFlag.Changed; db.SaveChanges(); } } }
private BackupDbEntities GetDbContextForThread() { var threadId = System.Threading.Thread.CurrentThread.ManagedThreadId; lock (_dbLock) { if (_entities.ContainsKey(threadId)) { return(_entities[threadId]); } var db = new BackupDbEntities(); _entities.Add(threadId, db); return(db); } }
public Directory GetDirectory(string path) { using (var db = new BackupDbEntities()) { var directory = db.Directories.FirstOrDefault(dir => dir.FullPath == path); if (directory == null) { var di = new DirectoryInfo(path); directory = new Directory { FullPath = path, IsNew = 1, Name = di.Name }; db.Directories.Add(directory); Logger.Info($"Creating folder: {di.Name}"); db.SaveChanges(); } return(directory); } }
public async Task DeleteFiles(Configuration config) { await Task.Yield(); using (var db = new BackupDbEntities()) { if (config.DeleteFiles) { var deletedFiles = db.Files.Where(x => x.IsNew == (long)StatusFlag.Deleted).ToList(); foreach (var deletedFile in deletedFiles.AsParallel()) { await Task.Yield(); //TODO delete file Logger.Info($"We should delete file: {deletedFile.FullPath}"); db.Files.Remove(deletedFile); } db.SaveChanges(); } } }
public async Task CopyFiles(Configuration config) { await Task.Yield(); using (var db = new BackupDbEntities()) { var remoteFolder = new DirectoryInfo(config.RemoteDirectory); var rootDirectory = new DirectoryInfo(config.RootDirectory); var changedFiles = db.Files.Where(x => x.IsNew == (long)StatusFlag.Changed).ToList(); var progress = new ProgressWorker(changedFiles); var rand = new Random(DateTime.Now.Millisecond); foreach (var changedFile in changedFiles.OrderBy(f => rand.Next()).AsParallel()) { try { var fi = new FileInfo(changedFile.FullPath); var directoryFullPath = fi.Directory.FullName; string dirDiff = directoryFullPath.Replace(rootDirectory.FullName, ""); var remoteDir = remoteFolder.FullName + dirDiff; if (!System.IO.Directory.Exists(remoteDir)) { System.IO.Directory.CreateDirectory(remoteDir); } var destinationPath = Path.Combine(remoteDir, fi.Name); System.IO.File.Copy(changedFile.FullPath, destinationPath, true); progress.SetFileCopied(changedFile); changedFile.IsNew = (long)StatusFlag.Unchanged; } catch (Exception ex) { Logger.Warn($"We were not able to upload file: {changedFile.FullPath}, {ex.Message}"); } } db.SaveChanges(); } }