Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 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();
     }
 }
Ejemplo n.º 3
0
        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();
                }
            }
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
 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);
     }
 }
Ejemplo n.º 6
0
        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();
                }
            }
        }
Ejemplo n.º 7
0
        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();
            }
        }