/// <summary> /// Синхронизация с сервером /// </summary> /// <param name="exec">Обязательная синхронизация</param> public static async Task <int> Synchronization(bool exec = false) { if (!User.IsConnectToServer) { return(1); } if (!IsServer) { return(2); } //Проверка существования на сервере связки логина и пароля using (var client = new HttpClient()) { HttpResponseMessage message = client.PostAsJsonAsync(ProgramSettings.AdressServer + "Server/RegistrationUser", new RegistrationData { Login = _login, Md5 = _md5 }).Result; string resultString = message.Content.ReadAsStringAsync().Result; bool result = Convert.ToBoolean(resultString); if (!result) { return(3); } } //Формирование локального списка файлов для синхронизации List <FileInfoData> fileInfos = new List <FileInfoData>(); if (User.IsSynchronizeSettingsWithServer) { //Файл настроек FileInfoData fileSettings = new FileInfoData("Settings.bin", "", true, User.DateLastEditSettings, FileToUpload.Settings, false, false); fileInfos.Add(fileSettings); } if (User.IsSynchronizeDatabaseWithServer) { //Файлы БД if (User.DBMSName == "SQLite") { FileInfoData fileDatabase = new FileInfoData("database.db", "", true, User.DateLastEditDatabase, FileToUpload.Database, false, false); if (File.Exists(Environment.CurrentDirectory + "\\data\\" + _login + "\\database.db")) { fileInfos.Add(fileDatabase); } } //Отсутствует поддержка синхронизации файлов SQL Server /*else * { * FileInfoData fileDatabase = new FileInfoData("database.mdf", "", true, User.DateLastEditDatabase, FileToUpload.Database, false, false); * fileInfos.Add(fileDatabase); * FileInfoData fileDatabaseLog = new FileInfoData("database_log.ldf", "", true, User.DateLastEditDatabase, FileToUpload.Database, * false, false); * fileInfos.Add(fileDatabaseLog); * }*/ } //Файлы резервных копий string[] backupFileNames = Directory.GetFiles(Environment.CurrentDirectory + "\\data\\" + _login + "\\Backups"); foreach (string elem in backupFileNames) { FileInfo infFile = new FileInfo(elem); FileInfoData file = new FileInfoData(infFile.Name, "", false, DateTime.Now, FileToUpload.Backup, false, false); fileInfos.Add(file); } //Файлы фото string[] photoFileNames = Directory.GetFiles(Environment.CurrentDirectory + "\\data\\" + _login + "\\Photos"); foreach (string elem in photoFileNames) { FileInfo infFile = new FileInfo(elem); FileInfoData file = new FileInfoData(infFile.Name, "", false, DateTime.Now, FileToUpload.Photo, false, false); fileInfos.Add(file); } //Файлы документов string[] documentFileNames = Directory.GetFiles(Environment.CurrentDirectory + "\\data\\" + _login + "\\Documents"); foreach (string elem in documentFileNames) { FileInfo infFile = new FileInfo(elem); FileInfoData file = new FileInfoData(infFile.Name, "", false, DateTime.Now, FileToUpload.Document, false, false); fileInfos.Add(file); } //Отправка списка файлов и получение списка сервера ListFileInfoData list = new ListFileInfoData(fileInfos.ToArray()); list.Login = _login; using (var client = new HttpClient()) { HttpResponseMessage message = client.PostAsJsonAsync(ProgramSettings.AdressServer + "Server/GetListFilesInfo", list).Result; string resp = message.Content.ReadAsStringAsync().Result; list = JsonConvert.DeserializeObject <ListFileInfoData>(resp); } //Начало отправки/загрузки файлов foreach (var elem in list.FilesInfo) { if (elem.IsUpload && exec) { string prevPath = ""; switch (elem.FileType) { case FileToUpload.Backup: prevPath = "Backups\\"; break; case FileToUpload.Document: prevPath = "Documents\\"; break; case FileToUpload.Photo: prevPath = "Photos\\"; break; } PostFileFromServerAsync(prevPath + elem.NameFile); } if (elem.IsDownload && !exec) { await GetFileFromServerAsync(elem.FileType, elem.NameFile); } } //Проверка дополнительных условий и удаление лишних файлов if (User.IsSynchronizeBackupWithServer) { foreach (var elem in backupFileNames) { File.Delete(elem); } } if (User.IsSynchronizeDocumentsWithServer) { foreach (var elem in documentFileNames) { File.Delete(elem); } } return(0); }
public JsonResult GetListFilesInfo([FromBody] ListFileInfoData list) { //Формирование полного пути string mainPath = Request.MapPath("..//data//" + list.Login); //Получение массивов путей к файлам string[] masb = Directory.GetFiles(mainPath + "\\Backups"); string[] masp = Directory.GetFiles(mainPath + "\\Photos"); string[] masd = Directory.GetFiles(mainPath + "\\Documents"); string[] masm = Directory.GetFiles(mainPath); //Получение списков имен файлов List <string> backupFileNames = new List <string>(); List <string> photoFileNames = new List <string>(); List <string> documentFileNames = new List <string>(); List <string> mainFileNames = new List <string>(); foreach (var elem in masb) { FileInfo infFile = new FileInfo(elem); backupFileNames.Add(infFile.Name); } foreach (var elem in masp) { FileInfo infFile = new FileInfo(elem); photoFileNames.Add(infFile.Name); } foreach (var elem in masd) { FileInfo infFile = new FileInfo(elem); documentFileNames.Add(infFile.Name); } foreach (var elem in masm) { FileInfo infFile = new FileInfo(elem); mainFileNames.Add(infFile.Name); } if (list.FilesInfo != null) { foreach (var elem in list.FilesInfo) { switch (elem.FileType) { case FileToUpload.Settings: { using (ServerDatabaseContext databaseContext = new ServerDatabaseContext()) { UserTable user = databaseContext.UserTables.FirstOrDefault(u => u.Login == list.Login); if (user.DateEditSetting == null || elem.DateChange - user.DateEditSetting.Value > TimeSpan.FromMinutes(1)) { user.DateEditSetting = DateTime.Now; databaseContext.SaveChanges(); elem.IsUpload = true; } else if (user.DateEditSetting.Value - elem.DateChange > TimeSpan.FromMinutes(1)) { if (System.IO.File.Exists(mainPath + "\\" + elem.NameFile)) { elem.IsDownload = true; } } if (mainFileNames.Contains(elem.NameFile)) { mainFileNames.Remove(elem.NameFile); } } break; } case FileToUpload.Database: { using (ServerDatabaseContext databaseContext = new ServerDatabaseContext()) { UserTable user = databaseContext.UserTables.FirstOrDefault(u => u.Login == list.Login); if (user.DateEditDatabase == null || elem.DateChange - user.DateEditDatabase.Value > TimeSpan.FromMinutes(1)) { user.DateEditDatabase = DateTime.Now; databaseContext.SaveChanges(); elem.IsUpload = true; } else if (user.DateEditDatabase.Value - elem.DateChange > TimeSpan.FromMinutes(1)) { if (System.IO.File.Exists(mainPath + "\\" + elem.NameFile)) { elem.IsDownload = true; } } if (mainFileNames.Contains(elem.NameFile)) { mainFileNames.Remove(elem.NameFile); } } break; } case FileToUpload.Backup: { if (!backupFileNames.Contains(elem.NameFile)) { using (ServerDatabaseContext databaseContext = new ServerDatabaseContext()) { UserTable user = databaseContext.UserTables.FirstOrDefault(u => u.Login == list.Login); databaseContext.BackupTables.Add(new BackupTable { BackupName = elem.NameFile, DateOfCreate = DateTime.Now, UserId = user.UserId }); databaseContext.SaveChanges(); elem.IsUpload = true; } } else { backupFileNames.Remove(elem.NameFile); } break; } case FileToUpload.Document: { if (!documentFileNames.Contains(elem.NameFile)) { elem.IsUpload = true; } else { documentFileNames.Remove(elem.NameFile); } break; } case FileToUpload.Photo: { if (!photoFileNames.Contains(elem.NameFile)) { elem.IsUpload = true; } else { photoFileNames.Remove(elem.NameFile); } break; } } } } List <FileInfoData> newList = list.FilesInfo.ToList(); if (documentFileNames.Count > 0) { foreach (var elem in documentFileNames) { newList.Add(new FileInfoData { DateChange = DateTime.Now, FileType = FileToUpload.Document, IsChanged = false, IsDownload = true, IsUpload = false, NameFile = elem, PathFile = "" }); } } if (photoFileNames.Count > 0) { foreach (var elem in photoFileNames) { newList.Add(new FileInfoData { DateChange = DateTime.Now, FileType = FileToUpload.Photo, IsChanged = false, IsDownload = true, IsUpload = false, NameFile = elem, PathFile = "" }); } } if (mainFileNames.Count > 0) { foreach (var elem in mainFileNames) { FileToUpload fileTo; if (elem == "Settings.bin") { fileTo = FileToUpload.Settings; } else { fileTo = FileToUpload.Database; } newList.Add(new FileInfoData { DateChange = DateTime.Now, FileType = fileTo, IsChanged = false, IsDownload = true, IsUpload = false, NameFile = elem, PathFile = "" }); } } list = new ListFileInfoData(newList.ToArray()); return(Json(list)); }