diff --git a/Sailboat/Sailboat/AbstractStrategy.cs b/Sailboat/Sailboat/AbstractStrategy.cs
index fc58dd3..195ce7f 100644
--- a/Sailboat/Sailboat/AbstractStrategy.cs
+++ b/Sailboat/Sailboat/AbstractStrategy.cs
@@ -5,6 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using Sailboat.DrawingObjects;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace Sailboat.MovementStrategy
{
public abstract class AbstractStrategy
diff --git a/Sailboat/Sailboat/BoatsGenericStorage.cs b/Sailboat/Sailboat/BoatsGenericStorage.cs
index 4f3476e..5dfbc1d 100644
--- a/Sailboat/Sailboat/BoatsGenericStorage.cs
+++ b/Sailboat/Sailboat/BoatsGenericStorage.cs
@@ -115,7 +115,7 @@ namespace Sailboat.Generics
}
if (data.Length == 0)
{
- throw new Exception("Невалиданя операция, нет данных для сохранения");
+ throw new Exception("Невалидная операция, нет данных для сохранения");
}
using (StreamWriter writer = new StreamWriter(filename))
{
@@ -127,58 +127,60 @@ namespace Sailboat.Generics
/// Загрузка информации по лодкам в хранилище из файла
///
/// Путь и имя файла
- /// true - загрузка прошла успешно, false - ошибка призагрузке данных
- public bool LoadData(string filename)
+ /// true - загрузка прошла успешно, false - ошибка при загрузке данных
+ public void LoadData(string filename)
{
if (!File.Exists(filename))
{
throw new Exception("Файл не найден");
}
- using (StreamReader bs = File.OpenText(filename))
+ string bufferTextFromFile = "";
+ using (FileStream fs = new(filename, FileMode.Open))
{
- string str = bs.ReadLine();
- if (str == null || str.Length == 0)
+ byte[] b = new byte[fs.Length];
+ UTF8Encoding temp = new(true);
+ while (fs.Read(b, 0, b.Length) > 0)
{
- throw new Exception("Нет данных для загрузки");
+ bufferTextFromFile += temp.GetString(b);
}
- if (!str.StartsWith("BoatStorage"))
- {
- throw new Exception("Неверный формат данных");
- }
-
- _boatStorages.Clear();
- string strs = "";
-
- while ((strs = bs.ReadLine()) != null)
- {
- if (strs == null)
- {
- return false;
- }
-
- string[] record = strs.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries);
- if (record.Length != 2)
- {
- continue;
- }
- BoatsGenericCollection collection = new(_pictureWidth, _pictureHeight);
- string[] set = record[1].Split(_separatorRecords, StringSplitOptions.RemoveEmptyEntries);
- foreach (string elem in set)
- {
- DrawingBoat? boat = elem?.CreateDrawingBoat(_separatorForObject, _pictureWidth, _pictureHeight);
- if (boat != null)
- {
- if (!(collection + boat))
- {
- throw new Exception("Ошибка добавления в коллекцию");
- }
- }
- }
- _boatStorages.Add(record[0], collection);
- }
- return true;
}
+ var strs = bufferTextFromFile.Split(new char[] { '\n', '\r' },
+ StringSplitOptions.RemoveEmptyEntries);
+ if (strs == null || strs.Length == 0)
+ {
+ throw new Exception("Нет данных для загрузки");
+ }
+ if (!strs[0].StartsWith("BoatStorage"))
+ {
+ //если нет такой записи, то это не те данные
+ throw new Exception("Неверный формат данных");
+ }
+
+ _boatStorages.Clear();
+ foreach (string data in strs)
+ {
+ string[] record = data.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries);
+ if (record.Length != 2)
+ {
+ continue;
+ }
+ BoatsGenericCollection collection = new(_pictureWidth, _pictureHeight);
+ string[] set = record[1].Split(_separatorRecords, StringSplitOptions.RemoveEmptyEntries);
+ foreach (string elem in set)
+ {
+ DrawingBoat? boat = elem?.CreateDrawingBoat(_separatorForObject, _pictureWidth, _pictureHeight);
+ if (boat != null)
+ {
+ if (!(collection + boat))
+ {
+ throw new Exception("Ошибка добавления в коллекцию");
+ }
+ }
+ }
+ _boatStorages.Add(record[0], collection);
+ }
+
}
}
}
\ No newline at end of file
diff --git a/Sailboat/Sailboat/ExtentionDrawningBoat.cs b/Sailboat/Sailboat/ExtentionDrawningBoat.cs
index 4e24140..b6e7320 100644
--- a/Sailboat/Sailboat/ExtentionDrawningBoat.cs
+++ b/Sailboat/Sailboat/ExtentionDrawningBoat.cs
@@ -40,7 +40,7 @@ namespace Sailboat.DrawingObjects
///
/// Получение данных для сохранения в файл
///
- /// Сохраняемый объект
+ /// Сохраняемый объект
/// Разделитель даннных
/// Строка с данными по объекту
public static string GetDataForSave(this DrawingBoat drawingBoat, char separatorForObject)
diff --git a/Sailboat/Sailboat/FormBoatCollection.cs b/Sailboat/Sailboat/FormBoatCollection.cs
index ed93da7..85982aa 100644
--- a/Sailboat/Sailboat/FormBoatCollection.cs
+++ b/Sailboat/Sailboat/FormBoatCollection.cs
@@ -19,11 +19,12 @@ namespace Sailboat
public partial class FormBoatCollection : Form
{
private readonly BoatsGenericStorage _storage;
- public FormBoatCollection()
+ private readonly ILogger _logger;
+ private FormBoatCollection(ILogger logger)
{
InitializeComponent();
_storage = new BoatsGenericStorage(pictureBoxCollection.Width, pictureBoxCollection.Height);
-
+ _logger = logger;
}
private void ReloadObjects()
@@ -52,6 +53,7 @@ namespace Sailboat
{
if (listBoxStorages.SelectedIndex == -1)
{
+ _logger.LogWarning("Коллекция не выбрана");
return;
}
var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
@@ -69,41 +71,47 @@ namespace Sailboat
{
if (listBoxStorages.SelectedIndex == -1)
{
+ _logger.LogWarning("Добавление пустого объекта");
return;
}
- var obj = _storage[listBoxStorages.SelectedItem.ToString() ??
- string.Empty];
+ var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
+ _logger.LogWarning("Добавление пустого объекта");
return;
}
+ try
+ {
+ if (obj + drawingBoat)
+ {
+ MessageBox.Show("Объект добавлен");
+ pictureBoxCollection.Image = obj.ShowBoats();
+ _logger.LogInformation($"Объект {obj.GetType()} добавлен");
- if (obj + drawingBoat)
- {
- MessageBox.Show("Объект добавлен");
- pictureBoxCollection.Image = obj.ShowBoats();
+ }
}
- else
+ catch (StorageOverflowException ex)
{
- MessageBox.Show("Не удалось добавить объект");
+ MessageBox.Show(ex.Message);
+ _logger.LogWarning($"{ex.Message} в наборе {listBoxStorages.SelectedItem.ToString()}");
}
}
- private void buttonRemoveBoat_Click(object sender, EventArgs e)
+ private void ButtonRemoveBoat_Click(object sender, EventArgs e)
{
if (listBoxStorages.SelectedIndex == -1)
{
+ _logger.LogWarning("Удаление объекта из несуществующего набора");
return;
}
- var obj = _storage[listBoxStorages.SelectedItem.ToString() ??
- string.Empty];
+ var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
- if (MessageBox.Show("Удалить объект?", "Удаление",
- MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
+ if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
+ _logger.LogWarning("Отмена удаления объекта");
return;
}
int pos = Convert.ToInt32(maskedTextBoxNumber.Text);
@@ -112,28 +120,28 @@ namespace Sailboat
if (obj - pos != null)
{
MessageBox.Show("Объект удален");
+ _logger.LogInformation($"Удален объект с позиции {pos}");
pictureBoxCollection.Image = obj.ShowBoats();
}
else
{
MessageBox.Show("Не удалось удалить объект");
+ _logger.LogWarning($"Не удалось удалить объект из набора {listBoxStorages.SelectedItem.ToString()}");
}
}
catch (BoatNotFoundException ex)
{
- MessageBox.Show("Не удалось удалить объект");
MessageBox.Show(ex.Message);
+ _logger.LogWarning($"{ex.Message} из набора {listBoxStorages.SelectedItem.ToString()}");
}
}
-
private void buttonRefreshCollection_Click(object sender, EventArgs e)
{
if (listBoxStorages.SelectedIndex == -1)
{
return;
}
- var obj = _storage[listBoxStorages.SelectedItem.ToString() ??
- string.Empty];
+ var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
@@ -146,12 +154,14 @@ namespace Sailboat
{
if (string.IsNullOrEmpty(textBoxStorageName.Text))
{
- MessageBox.Show("Не все данные заполнены", "Ошибка",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
+ MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ _logger.LogWarning("Коллекция не добавлена, не все данные заполнены");
return;
}
_storage.AddSet(textBoxStorageName.Text);
ReloadObjects();
+
+ _logger.LogInformation($"Добавлен набор: {textBoxStorageName.Text}");
}
private void ListBoxObjects_SelectedIndexChanged(object sender, EventArgs e)
@@ -164,14 +174,18 @@ namespace Sailboat
{
if (listBoxStorages.SelectedIndex == -1)
{
+ _logger.LogWarning("Удаление невыбранного набора");
return;
}
+ string name = listBoxStorages.SelectedItem.ToString() ?? string.Empty;
if (MessageBox.Show($"Удалить объект {listBoxStorages.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
_storage.DelSet(listBoxStorages.SelectedItem.ToString()
?? string.Empty);
ReloadObjects();
+ _logger.LogInformation($"Удален набор: {name}");
}
+ _logger.LogWarning("Отмена удаления набора");
}
private void SaveToolStripMenuItem_Click(object sender, EventArgs e)
@@ -179,15 +193,14 @@ namespace Sailboat
try
{
_storage.SaveData(saveFileDialog.FileName);
- MessageBox.Show("Сохранение прошло успешно",
- "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ _logger.LogInformation($"Данные загружены в файл {saveFileDialog.FileName}");
+
}
catch (Exception ex)
{
- MessageBox.Show("Не сохранилось", "Результат",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- MessageBox.Show($"Не сохранилось: {ex.Message}",
- "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ _logger.LogWarning($"Не удалось сохранить информацию в файл: {ex.Message}");
}
}
@@ -198,9 +211,8 @@ namespace Sailboat
try
{
_storage.LoadData(openFileDialog.FileName);
- MessageBox.Show("Загрузка прошла успешно",
- "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
- Log.Information($"Файл {openFileDialog.FileName} успешно загружен");
+ MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ _logger.LogInformation($"Данные загружены из файла {openFileDialog.FileName}");
foreach (var collection in _storage.Keys)
{
listBoxStorages.Items.Add(collection);
@@ -213,13 +225,12 @@ namespace Sailboat
}
catch (Exception ex)
{
- Log.Warning("Не удалось загрузить");
MessageBox.Show($"Не загрузилось: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
-
+ _logger.LogWarning($"Не удалось загрузить информацию из файла: {ex.Message}");
}
}
ReloadObjects();
}
}
-}
+}
\ No newline at end of file
diff --git a/Sailboat/Sailboat/Program.cs b/Sailboat/Sailboat/Program.cs
index fac24ad..dad5c4b 100644
--- a/Sailboat/Sailboat/Program.cs
+++ b/Sailboat/Sailboat/Program.cs
@@ -1,3 +1,5 @@
+using System;
+
namespace Sailboat
{
internal static class Program
@@ -11,7 +13,30 @@ namespace Sailboat
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
- Application.Run(new FormBoatCollection());
+ var services = new ServiceCollection();
+ ConfigureServices(services);
+ using (ServiceProvider serviceProvider = services.BuildServiceProvider())
+ {
+ Application.Run(serviceProvider.GetRequiredService());
+ }
+ }
+
+ private static void ConfigureServices(ServiceCollection services)
+ {
+ services.AddSingleton().AddLogging(option =>
+ {
+ string[] path = Directory.GetCurrentDirectory().Split('\\');
+ string pathNeed = "";
+ for (int i = 0; i < path.Length - 3; i++)
+ {
+ pathNeed += path[i] + "\\";
+ }
+ var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(path: $"{pathNeed}appSetting.json", optional: false, reloadOnChange: true).Build();
+ var logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();
+
+ option.SetMinimumLevel(LogLevel.Information);
+ option.AddSerilog(logger);
+ });
}
}
}
\ No newline at end of file
diff --git a/Sailboat/Sailboat/Sailboat.csproj b/Sailboat/Sailboat/Sailboat.csproj
index 13ee123..a67e15a 100644
--- a/Sailboat/Sailboat/Sailboat.csproj
+++ b/Sailboat/Sailboat/Sailboat.csproj
@@ -8,6 +8,10 @@
enable
+
+
+
+
True
diff --git a/Sailboat/Sailboat/Status.cs b/Sailboat/Sailboat/Status.cs
index 3d1bc4d..aec198e 100644
--- a/Sailboat/Sailboat/Status.cs
+++ b/Sailboat/Sailboat/Status.cs
@@ -1,18 +1,113 @@
-using System;
+using Sailboat.Exceptions;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace Sailboat.MovementStrategy
+namespace Sailboat.Generics
{
- ///
- /// Статус выполнения операции перемещения
- ///
- public enum Status
+
+ internal class SetGeneric where T : class
{
- NotInit,
- InProgress,
- Finish
+ ///
+ /// Список объектов, которые храним
+ ///
+ private readonly List _places;
+ ///
+ /// Количество объектов в массиве
+ ///
+ public int Count => _places.Count;
+ ///
+ /// Максимальное количество объектов в списке
+ ///
+ private readonly int _maxCount;
+ ///
+ /// Конструктор
+ ///
+ ///
+ public SetGeneric(int count)
+ {
+ _maxCount = count;
+ _places = new List(count);
+ }
+ ///
+ /// Добавление объекта в набор
+ ///
+ /// Добавляемая лодка
+ ///
+ public bool Insert(T boat)
+ {
+ return Insert(boat, 0);
+ }
+ ///
+ /// Добавление объекта в набор на конкретную позицию
+ ///
+ /// Добавляемая лодка
+ /// Позиция
+ ///
+ public bool Insert(T boat, int position)
+ {
+ if (position < 0 || position >= _maxCount)
+ throw new BoatNotFoundException(position);
+
+ if (Count >= _maxCount)
+ throw new StorageOverflowException(_maxCount);
+ _places.Insert(0, boat);
+ return true;
+ }
+ ///
+ /// Удаление объекта из набора с конкретной позиции
+ ///
+ ///
+ ///
+ public bool Remove(int position)
+ {
+ if (position < 0 || position > _maxCount || position >= Count)
+ throw new BoatNotFoundException(position);
+
+ _places.RemoveAt(position);
+ return true;
+ }
+ ///
+ /// Получение объекта из набора по позиции
+ ///
+ ///
+ ///
+ public T? this[int position]
+ {
+ get
+ {
+ if (position < 0 || position >= Count)
+ {
+ return null;
+ }
+ return _places[position];
+ }
+ set
+ {
+ if (!(position >= 0 && position < Count && _places.Count < _maxCount))
+ {
+ return;
+ }
+ _places.Insert(position, value);
+ return;
+ }
+ }
+ ///
+ /// Проход по списку
+ ///
+ ///
+ public IEnumerable GetBoats(int? maxBoats = null)
+ {
+ for (int i = 0; i < _places.Count; ++i)
+ {
+ yield return _places[i];
+ if (maxBoats.HasValue && i == maxBoats.Value)
+ {
+ yield break;
+ }
+ }
+ }
}
-}
+}
\ No newline at end of file
diff --git a/Sailboat/Sailboat/appSetting.json b/Sailboat/Sailboat/appSetting.json
new file mode 100644
index 0000000..38552ff
--- /dev/null
+++ b/Sailboat/Sailboat/appSetting.json
@@ -0,0 +1,20 @@
+{
+ "Serilog": {
+ "Using": [ "Serilog.Sinks.File" ],
+ "MinimumLevel": "Information",
+ "WriteTo": [
+ {
+ "Name": "File",
+ "Args": {
+ "path": "Logs/log_.log",
+ "rollingInterval": "Day",
+ "outputTemplate": "[{Timestamp:HH:mm:ss.fff}]{Level:u4}: {Message:lj}{NewLine}{Exception}"
+ }
+ }
+ ],
+ "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
+ "Properties": {
+ "Application": "Sailboat"
+ }
+ }
+}
\ No newline at end of file