/// <summary> /// Выполняем синхронизацию /// </summary> /// <returns> /// Возваращаем TRUE, если функция успешно выполнила работу /// </returns> public static Boolean Synch() { Console.Clear(); string[] paths = Directory.GetFiles(Assistant.paths); string[] paths_choosed = new string[1] { "0" }; List <int> exists_paths = new List <int>(); if (paths.Length != 0 && paths.Length != 1) { Console.WriteLine("Сейчас у вас имеется ряд путей. "); Console.WriteLine("Укажите через запятую набор тех путей, которые хотите синхронизировать."); Console.WriteLine(); Console.WriteLine("-------------------------"); foreach (string path in paths) { Console.WriteLine(Assistant.CutNameWithoutExtension(path).ToString()); Console.WriteLine("IN: " + Assistant.GetPath(Assistant.PathsType.IN, Assistant.paths + Assistant.CutNameWithoutExtension(path) + ".sys")); Console.WriteLine("FROM: " + Assistant.GetPath(Assistant.PathsType.FROM, Assistant.paths + Assistant.CutNameWithoutExtension(path) + ".sys")); Console.WriteLine(); exists_paths.Add(Assistant.CutNameWithoutExtension(path)); } Console.WriteLine("-------------------------"); Console.Write("Пути: "); paths_choosed = Console.ReadLine().Split(','); } List <string> delete_dirs = new List <string>(); List <string> delete_files = new List <string>(); List <string> dirs = new List <string>(); List <string> files = new List <string>(); foreach (string path_choosed in paths_choosed) { //Не большой блок проверки следующих параметров: //1. Выбраны только цифры //2. Выбранные цифры существуют. try { Convert.ToInt32(path_choosed); } catch (Exception) { return(false); } bool number_exists = false; foreach (int exists_path in exists_paths) { if (exists_path.ToString() == path_choosed) { number_exists = true; break; } } if (!number_exists && exists_paths.Count != 0) { return(false); } string path_in = Assistant.GetPath(Assistant.PathsType.IN, Assistant.paths + path_choosed.ToString() + ".sys"); string path_from = Assistant.GetPath(Assistant.PathsType.FROM, Assistant.paths + path_choosed.ToString() + ".sys"); Console.WriteLine("Запущена проверка путей: "); Console.WriteLine("IN: " + path_in); Console.WriteLine("FROM: " + path_from); Console.WriteLine(); try { string[] dirs_in = Directory.GetDirectories(path_in); string[] dirs_from = Directory.GetDirectories(path_from); Console.WriteLine(); Console.WriteLine("Запущена проверка удаление/добавление новых альбомов.."); // Проверяем, не пришло ли нам меньше альбомов, чем у нас имеется. foreach (string dir_in in dirs_in) { bool exists = false; foreach (string dir_from in dirs_from) { if (Assistant.CutNameWithExtension(dir_in) == Assistant.CutNameWithExtension(dir_from)) { exists = true; break; } } if (!exists) { delete_dirs.Add(dir_in); } } // Проверяем, не пришло ли нам больше альбомов, чем у нас имеется foreach (string dir_from in dirs_from) { bool exists = false; foreach (string dir_in in dirs_in) { if (Assistant.CutNameWithExtension(dir_from) == Assistant.CutNameWithExtension(dir_in)) { exists = true; break; } } if (!exists) { dirs.Add(dir_from); } } Console.WriteLine("Выполнена проверка на удаление/добавление новых альбомов."); Console.WriteLine(); int counter_dirs = 0; Console.WriteLine(); Console.WriteLine("Запущена проверка на поиск новых файлов по каждому альбому.."); // Проверяем, не добавились ли новые файлы foreach (string dir_from in dirs_from) { counter_dirs++; Console.WriteLine("Проверяем альбом: " + Assistant.CutNameWithExtension(dir_from) + " " + counter_dirs.ToString() + "/" + dirs_from.Length.ToString()); foreach (string dir_in in dirs_in) { if (Assistant.CutNameWithExtension(dir_from) == Assistant.CutNameWithExtension(dir_in)) { string[] files_in = Directory.GetFiles(dir_in); string[] files_from = Directory.GetFiles(dir_from); foreach (string file_from in files_from) { bool exists = false; foreach (string file_in in files_in) { if (Assistant.CutNameWithExtension(file_in) == Assistant.CutNameWithExtension(file_from)) { exists = true; break; } } if (!exists) { files.Add(file_from); } } } } } counter_dirs = 0; Console.WriteLine(); Console.WriteLine("Запущена проверка на поиск удаленных файлов по каждому альбому.."); // Проверяем, не стало ли файлов меньше foreach (string dir_in in dirs_in) { counter_dirs++; Console.WriteLine("Проверяем альбом: " + Assistant.CutNameWithExtension(dir_in) + " " + counter_dirs.ToString() + "/" + dirs_in.Length.ToString()); foreach (string dir_from in dirs_from) { if (Assistant.CutNameWithExtension(dir_in) == Assistant.CutNameWithExtension(dir_from)) { string[] files_in = Directory.GetFiles(dir_in); string[] files_from = Directory.GetFiles(dir_from); foreach (string file_in in files_in) { bool exists = false; foreach (string file_from in files_from) { if (Assistant.CutNameWithExtension(file_in) == Assistant.CutNameWithExtension(file_from)) { exists = true; break; } } if (!exists) { delete_files.Add(file_in); } } } } } } catch (Exception) { return(false); } Console.WriteLine("\n--------------------"); Console.WriteLine("По итогу мы имеем следующую картину:\n"); if (dirs.Count > 0) { Console.WriteLine(" Появились следующие альбомы:\n"); Assistant.PrintPaths(dirs); } if (files.Count > 0) { Console.WriteLine(" Появились следующие файлы:\n"); Assistant.PrintPaths(files); } if (delete_dirs.Count > 0) { Console.WriteLine(" Отсутствуют следующие альбомы:\n"); Assistant.PrintPaths(delete_dirs); } if (delete_files.Count > 0) { Console.WriteLine(" Отсутствуют следующие файлы:\n"); Assistant.PrintPaths(delete_files); } Console.WriteLine("----------------------"); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("\nВведите те цифры, команды которых необходимо выполнить..\n"); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("\nПримите решение..\n"); Console.WriteLine("1. Удалить отсутствующие данные"); Console.WriteLine("2. Скопировать файлы"); Console.WriteLine("3. Скопировать альбомы."); Console.WriteLine(); string[] lines = null; using (StreamReader sr = new StreamReader(Assistant.journal)) { lines = sr.ReadToEnd().Replace("\r\n", "-").Split('-'); for (int i = 0; i < lines.Length; i++) { if (lines[i] != "") { int idx = lines[i].IndexOf(':'); int stats = Convert.ToInt32(lines[i].Remove(0, idx + 1)); if (lines[i].StartsWith("dirs")) { lines[i] = "dirs:" + (stats + dirs.Count).ToString(); } else if (lines[i].StartsWith("files")) { lines[i] = "files:" + (stats + files.Count).ToString(); } else if (lines[i].StartsWith("delete_dirs")) { lines[i] = "delete_dirs:" + (stats + delete_dirs.Count).ToString(); } else if (lines[i].StartsWith("delete_files")) { lines[i] = "delete_files:" + (stats + delete_files.Count).ToString(); } } } } using (StreamWriter sw = new StreamWriter(Assistant.journal)) { foreach (string line in lines) { sw.WriteLine(line); } } string answer = Console.ReadLine(); Console.WriteLine(); foreach (char choise in answer) { // Выполняем удаление if (choise == '1') { foreach (string path in delete_dirs) { Directory.Delete(path, true); } foreach (string path in delete_files) { File.Delete(path); } Console.WriteLine("Удаление выполнено успешно."); continue; } // Выполняем копирование файлов if (choise == '2') { foreach (string path in files) { string file = path.Replace(path_from, ""); File.Copy(path, path_in + file); } Console.WriteLine("Копирование файлов выполнено успешно."); continue; } // Выполняем копирование папок if (choise == '3') { foreach (string path in dirs) { string folder = path.Replace(path_from, ""); Directory.CreateDirectory(path_in + folder); string[] files_in_folder = Directory.GetFiles(path); foreach (string file in files_in_folder) { File.Copy(file, path_in + folder + "\\" + Assistant.CutNameWithExtension(file)); } } Console.WriteLine("Копирование альбомов выполнено успешно."); continue; } } } Console.WriteLine("\nСинхронизация успешно завершена."); Assistant.Sleep(); return(true); }