static void Main(string[] args) { User user = new User(); WorkPC workPC = new WorkPC(); try { Menu.Start(user, workPC); } catch (DivideByZeroException e) { Design.Red(); WriteLine("\n [err] " + e.Message); } catch (FormatException e) { Design.Red(); WriteLine("\n [err] " + e.Message); } catch (DownloadMoreThanExistsException e) { Design.Red(); WriteLine("\n [err] " + e.Message); } catch (Exception e) { Design.Red(); WriteLine("\n [err] " + e.Message); } finally { Design.Default(); WriteLine("\n >>> Завершение программы.\n"); } }
// Копирование информации на устройства. public static void CopyingInfo(WorkPC workPC, Storage[] storage) { WriteLine(" До копирования:\n" + workPC); Design.Line(); if (storage.Length == 0) // если нет носителей. { Design.Blue(); WriteLine(" --> Нет носителей на которые можно скопировать информацию."); Design.Default(); return; } else if (FileIsPlaced(workPC.FileSize, storage)) // если файл вмещаеться. { Design.Green(); WriteLine(" >> Копирование."); Design.Default(); } else { Design.Blue(); WriteLine(" --> Файлы не вмещаються на данные носители."); Design.Default(); return; } // Копирование. while (workPC.TotalSizeOfFiles != 0) { foreach (Storage item in storage) { item.CopyingDataToTheDevice(workPC); // После каждого копирования на носитель, нужно скачать // с него записанную информацию: // имитируем скачивание приравниванием к "0". item.BusyMemory = 0; // освободили носитель. // Если все скопировали. if (workPC.TotalSizeOfFiles == 0) { break; } } if (workPC.TotalSizeOfFiles < 0) { throw new DownloadMoreThanExistsException(); } } // Файлов на пк больше нет - значит размер файла можно приравнять к 0. // (P.S. Соответственно на носителе в переменной можно хранить размер одного файла). workPC.FileSize = 0; WriteLine("\n После копирования:\n" + workPC); Design.Line(); }
// Копирование данных(файлов/папок) на устройство. public virtual void CopyingDataToTheDevice(WorkPC workPC) { // Узнаем сколько файлов вмещается на носитель. int numberOfFiles = PlacedFiles(workPC.FileSize); for (int i = 0; i < numberOfFiles; i++) { BusyMemory += workPC.FileSize; workPC.TotalSizeOfFiles -= workPC.FileSize; // Если файлов больше нет. if (workPC.TotalSizeOfFiles == 0) { return; } } }
// Расчет времени необходимого для копирования. public static void CopyTime(WorkPC workPC, Storage[] storage) { int recordingTime = 0; int readingTime = 0; int files; int totalSizeOfFiles = workPC.TotalSizeOfFiles; if (storage.Length == 0) // если нет носителей. { Design.Blue(); WriteLine(" --> Время рассчитать невозможно."); WriteLine(" --> Нет носителей на которые можно скопировать информацию."); Design.Default(); return; } else if (!FileIsPlaced(workPC.FileSize, storage)) { Design.Blue(); WriteLine(" --> Файлы не вмещаються на данные носители."); Design.Default(); return; } // Пока не посчитаем время копирования всех файлов. while (totalSizeOfFiles != 0) { foreach (Storage item in storage) { files = item.PlacedFiles(workPC.FileSize); // Если файлов осталось меньше чем вмещаеться на носитель. if ((totalSizeOfFiles / workPC.FileSize) < files) { // то запомним сколько осталось файлов. files = totalSizeOfFiles / workPC.FileSize; } // Если кол-во файлов = 0, // то переходим к следующему носителю. if (files == 0) { continue; } recordingTime += ((workPC.FileSize * files) * 1024) / item.RecordingTime(); readingTime += ((workPC.FileSize * files) * 1024) / item.ReadingTime(); // Отнимаем от общего размера, размер вмещающихся файлов. totalSizeOfFiles = totalSizeOfFiles - (workPC.FileSize * files); if (totalSizeOfFiles == 0) { break; } } if (totalSizeOfFiles < 0) { throw new DownloadMoreThanExistsException(); } } WriteLine($" Время копирования на носители: {recordingTime} мин"); WriteLine($" Время чтения с носителей: {readingTime} мин"); WriteLine(" Общее время копирования на другой пк: " + $"{recordingTime + readingTime} мин"); }
// Расчет необходимого количества носителей информации // представленных типов для переноса информации. public static void NumberOfStorage(WorkPC workPC, Storage[] storage) { int totalSizeOfFiles = workPC.TotalSizeOfFiles; int files; int[] arr = new int[storage.Length]; if (storage.Length == 0) // если нет носителей. { Design.Blue(); WriteLine(" --> Необходимое количество рассчитать невозможно."); WriteLine(" --> Нет носителей на которые можно скопировать информацию."); Design.Default(); return; } else if (!FileIsPlaced(workPC.FileSize, storage)) { Design.Blue(); WriteLine(" --> Файлы не вмещаються на данные носители."); Design.Default(); return; } while (totalSizeOfFiles != 0) { for (int i = 0; i < storage.Length; i++) { // Узнаем кол-во файлов вмещающихся на носитель. files = storage[i].PlacedFiles(workPC.FileSize); // Если файлов осталось меньше чем вмещаеться на носитель. if ((totalSizeOfFiles / workPC.FileSize) < files) { // то запомним сколько осталось файлов. files = totalSizeOfFiles / workPC.FileSize; } // Если кол-во файлов = 0, // то переходим к следующему носителю. if (files == 0) { continue; } // Отнимаем от общего размера, размер вмещающихся файлов. totalSizeOfFiles = totalSizeOfFiles - (workPC.FileSize * files); // Если вмещается больше чем 0 файлов. if (files > 0) { arr[i]++; } if (totalSizeOfFiles == 0) { break; } } if (totalSizeOfFiles < 0) { throw new DownloadMoreThanExistsException(); } } for (int i = 0; i < storage.Length; i++) { WriteLine($" Количество {storage[i].Name}: {arr[i]}"); } }
public static void Start(User user, WorkPC workPC) { ConsoleKeyInfo SymbolKey; // Просим ввести данные о файлах на ПК. Write("\n Введите размер одного файла (на ПК): "); workPC.FileSize = Convert.ToInt32(ReadLine()); Write(" Введите кол-во файлов (на ПК): "); workPC.TotalSizeOfFiles = workPC.FileSize * Convert.ToInt32(ReadLine()); // Запуск меню. while (true) { WriteLine("\n Меню:"); WriteLine(" 1 - Посмотреть данные о файлах на ПК"); WriteLine(" 2 - Посмотреть список носителей"); WriteLine(" 3 - Добавить носитель"); WriteLine(" 4 - Общее количество памяти всех носителей"); WriteLine(" 5 - Копирование информации на носители"); WriteLine(" 6 - Время необходимое для копирования"); WriteLine(" 7 - Необходимое количество носителей"); WriteLine(" 0 - Выход"); Write(" Ваш выбор: "); SymbolKey = ReadKey(); WriteLine(); Design.Line(); switch (SymbolKey.Key) { case ConsoleKey.D1: case ConsoleKey.NumPad1: WriteLine(workPC); break; case ConsoleKey.D2: case ConsoleKey.NumPad2: PrintStorage(user.GetDevices()); break; case ConsoleKey.D3: case ConsoleKey.NumPad3: AddUserStorage(user); break; case ConsoleKey.D4: case ConsoleKey.NumPad4: Calculations.TotalDeviceMemory(user.GetDevices()); break; case ConsoleKey.D5: case ConsoleKey.NumPad5: Calculations.CopyingInfo(workPC, user.GetDevices()); break; case ConsoleKey.D6: case ConsoleKey.NumPad6: Calculations.CopyTime(workPC, user.GetDevices()); break; case ConsoleKey.D7: case ConsoleKey.NumPad7: Calculations.NumberOfStorage(workPC, user.GetDevices()); break; default: break; } if (SymbolKey.Key == ConsoleKey.D0 || SymbolKey.Key == ConsoleKey.Escape || SymbolKey.Key == ConsoleKey.NumPad0) { return; } WriteLine("\n\n Нажмите любую клавишу для продолжения ..."); ReadKey(); Clear(); } }