using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Cruiser.Drawing; using Cruiser.MovementStrategy; using System.IO; namespace Cruiser.Generics { internal class CruisersGenericStorage { /// /// Разделитель для записи ключа и значения элемента словаря /// private static readonly char _separatorForKeyValue = '|'; /// /// Разделитель для записей коллекции данных в файл /// private readonly char _separatorRecords = ';'; /// /// Разделитель для записи информации по объекту в файл /// private static readonly char _separatorForObject = ':'; /// /// Словарь (хранилище) /// readonly Dictionary> _cruiserStorages; /// /// Возвращение списка названий наборов /// public List Keys => _cruiserStorages.Keys.ToList(); /// /// Ширина окна отрисовки /// private readonly int _pictureWidth; /// /// Высота окна отрисовки /// private readonly int _pictureHeight; /// /// Конструктор /// /// /// public CruisersGenericStorage(int pictureWidth, int pictureHeight) { _cruiserStorages = new Dictionary>(); _pictureWidth = pictureWidth; _pictureHeight = pictureHeight; } /// /// Добавление набора /// /// Название набора public void AddSet(string name) { if (_cruiserStorages.ContainsKey(new CruiserCollectionInfo(name, string.Empty))) return; _cruiserStorages[new CruiserCollectionInfo(name, string.Empty)] = new CarsGenericCollection(_pictureWidth, _pictureHeight); } /// /// Удаление набора /// /// Название набора public void DelSet(string name) { if (!_cruiserStorages.ContainsKey(new CruiserCollectionInfo(name, string.Empty))) return; _cruiserStorages.Remove(new CruiserCollectionInfo(name, string.Empty)); } /// /// Доступ к набору /// /// /// public CarsGenericCollection? this[string ind] { get { if (_cruiserStorages.ContainsKey(new CruiserCollectionInfo(ind, string.Empty))) return _cruiserStorages[new CruiserCollectionInfo(ind, string.Empty)]; return null; } } /// /// Сохранение информации по автомобилям в хранилище в файл /// /// Путь и имя файла /// true - сохранение прошло успешно, false - ошибка при сохранении данных public bool SaveData(string filename) { if (File.Exists(filename)) { File.Delete(filename); } StringBuilder data = new(); foreach (KeyValuePair> record in _cruiserStorages) { StringBuilder records = new(); foreach (DrawingCruiser? elem in record.Value.GetCruisers) { records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); } data.AppendLine($"{record.Key}{_separatorForKeyValue}{records}"); } if (data.Length == 0) { throw new Exception("Невалиданя операция, нет данных для сохранения"); } string dataStr = data.ToString(); using (StreamWriter writer = new StreamWriter(filename)) { writer.WriteLine("CruiserStorage"); writer.WriteLine(dataStr); } return true; } /// /// Загрузка информации по крейсеру в хранилище из файла /// /// Путь и имя файла /// true - загрузка прошла успешно, false - ошибка при загрузке данных public bool LoadData(string filename) { if (!File.Exists(filename)) { throw new FileNotFoundException("Файл не найден"); } using (StreamReader reader = new StreamReader(filename)) { string checker = reader.ReadLine(); if (checker == null) { throw new NullReferenceException("Нет данных для загрузки"); } if (!checker.StartsWith("CruiserStorage")) { throw new FormatException("Неверный формат данных"); } _cruiserStorages.Clear(); string strs; bool firstinit = true; while ((strs = reader.ReadLine()) != null) { if (strs == null && firstinit) return false; if (strs == null) break; if (strs == string.Empty) break; firstinit = false; string name = strs.Split('|')[0]; CarsGenericCollection collection = new(_pictureWidth, _pictureHeight); foreach (string data in strs.Split('|')[1].Split(';').Reverse()) { DrawingCruiser? cruiser = data?.CreateDrawingCruiser(_separatorForObject, _pictureWidth, _pictureHeight); if (cruiser != null) { try { bool? tmp = collection + cruiser; } catch (ApplicationException ex) { throw new ApplicationException($"Ошибка добавления в коллекцию: {ex.Message}"); } } } _cruiserStorages.Add(new CruiserCollectionInfo(name, string.Empty), collection); } return true; } } } }