From 0fb40581865a74167431fe147b7e90575e33bacf Mon Sep 17 00:00:00 2001 From: babaev-an Date: Mon, 8 Apr 2024 14:12:22 +0300 Subject: [PATCH] 20240408 --- anbs_cp/Extensions/EncodingExtension.cs | 2 +- anbs_cp/Extensions/FileExtensions.cs | 98 +++++++++++++++++++------ anbs_cp/Extensions/ListExtensions.cs | 83 +++++++++++++++++++++ anbs_cp/anbs_cp.csproj | 2 +- 4 files changed, 160 insertions(+), 25 deletions(-) create mode 100644 anbs_cp/Extensions/ListExtensions.cs diff --git a/anbs_cp/Extensions/EncodingExtension.cs b/anbs_cp/Extensions/EncodingExtension.cs index 1ec7afd..8f56240 100644 --- a/anbs_cp/Extensions/EncodingExtension.cs +++ b/anbs_cp/Extensions/EncodingExtension.cs @@ -11,5 +11,5 @@ public static class EncodingExtensions /// Кодировка UTF8 без Bom /// // ReSharper disable once InconsistentNaming - public static Encoding UTF8WithoutBom (this Encoding encoding) => new UTF8Encoding(encoderShouldEmitUTF8Identifier: false); + public static Encoding UTF8WithoutBom (this Encoding encoding) => new UTF8Encoding(false); } \ No newline at end of file diff --git a/anbs_cp/Extensions/FileExtensions.cs b/anbs_cp/Extensions/FileExtensions.cs index 33de07d..06cb751 100644 --- a/anbs_cp/Extensions/FileExtensions.cs +++ b/anbs_cp/Extensions/FileExtensions.cs @@ -1,7 +1,9 @@ -using System.Text; +// ReSharper disable MemberCanBePrivate.Global using anbs_cp.Classes; +using System.Text; + namespace anbs_cp.Extensions; /// @@ -33,6 +35,23 @@ public static class FileExtension public static FileHash GetHash (string fileName) => new(fileName); + #region Write + /// + /// Записывает данные в текстовый файл + /// + /// Тип данных + /// Данные + /// Имя файла + /// Кодировка + public static void Write (T data, string fileName, Encoding encoding) + { + // Открываю файл для создания или перезаписи + using StreamWriter writer = new(new FileStream(fileName, FileMode.OpenOrCreate), encoding); + + // Записываю + writer.WriteLine(new NewtonsoftJsonSerializer().Serialize(data)); + } + /// /// Записывает данные в текстовый файл /// @@ -40,34 +59,50 @@ public static class FileExtension /// Данные /// Имя файла /// Нужно ли использовать кодировку UTF8 With BOM или UTF8 Without BOM - public static void Write (T data, string fileName, bool useUtf8WithBom = false) + public static void Write (T data, string fileName, bool useUtf8WithBom = false) => Write(data, fileName, + useUtf8WithBom ? Encoding.UTF8 : Encoding.UTF8.UTF8WithoutBom()); + + /// + /// Записывает все данные из списка в текстовый файл + /// + /// Данные + /// Имя файла + /// Кодировка файла + /// Тип данных + public static void WriteAll (IEnumerable data, string fileName, Encoding encoding) { - // Кодировка - Encoding filEncoding = - useUtf8WithBom ? Encoding.UTF8 : Encoding.UTF8.UTF8WithoutBom(); - // Открываю файл для создания или перезаписи - using StreamWriter writer = new(new FileStream(fileName, FileMode.OpenOrCreate), filEncoding); + using StreamWriter writer = new(new FileStream(fileName, FileMode.OpenOrCreate), encoding); - // Записываю - writer.WriteLine(new NewtonsoftJsonSerializer().Serialize(data)); + // Для каждого элемента списка + foreach (T element in data) + // - записываю его строкой в файл + writer.WriteLine(new NewtonsoftJsonSerializer().Serialize(element)); } + /// + /// Записывает все данные из списка в текстовый файл + /// + /// Данные + /// Имя файла + /// Нужно ли использовать кодировку UTF8 With BOM или UTF8 Without BOM + /// Тип данных + public static void WriteAll (IEnumerable data, string fileName, bool useUtf8WithBom = false) => + WriteAll(data, fileName, useUtf8WithBom ? Encoding.UTF8 : Encoding.UTF8.UTF8WithoutBom()); + #endregion + + #region Read /// /// Читает первую строку из текстового файла /// /// Имя файла - /// Нужно ли использовать кодировку UTF8 With BOM или UTF8 Without BOM + /// Кодировка файла /// Тип выходных данных /// Данные или null - public static T? Read (string fileName, bool useUtf8WithBom = false) + public static T? Read (string fileName, Encoding encoding) { - // Кодировка - Encoding filEncoding = - useUtf8WithBom ? Encoding.UTF8 : Encoding.UTF8.UTF8WithoutBom(); - // Открываю файл для чтения - using StreamReader reader = new(new FileStream(fileName, FileMode.Open), filEncoding); + using StreamReader reader = new(new FileStream(fileName, FileMode.Open), encoding); // Считываю первую запись string serialized = reader.ReadLine() ?? "{}"; @@ -77,23 +112,29 @@ public static class FileExtension } /// - /// Читает все строки из текстового файла + /// Читает первую строку из текстового файла /// /// Имя файла /// Нужно ли использовать кодировку UTF8 With BOM или UTF8 Without BOM /// Тип выходных данных + /// Данные или null + public static T? Read (string fileName, bool useUtf8WithBom = false) => Read(fileName, + useUtf8WithBom ? Encoding.UTF8 : Encoding.UTF8.UTF8WithoutBom()); + + /// + /// Читает все строки из текстового файла + /// + /// Имя файла + /// Кодировка файла + /// Тип выходных данных /// Список данных - public static IEnumerable ReadAll (string fileName, bool useUtf8WithBom = false) + public static IEnumerable ReadAll (string fileName, Encoding encoding) { // Создаю результат List result = []; - // Кодировка - Encoding filEncoding = - useUtf8WithBom ? Encoding.UTF8 : Encoding.UTF8.UTF8WithoutBom(); - // Открываю файл для чтения - using StreamReader reader = new(new FileStream(fileName, FileMode.Open), filEncoding); + using StreamReader reader = new(new FileStream(fileName, FileMode.Open), encoding); // Пока есть строки в файле while (reader.ReadLine() is { } serialized) @@ -110,4 +151,15 @@ public static class FileExtension // Возвращаю полученный список return result.AsEnumerable(); } + + /// + /// Читает все строки из текстового файла + /// + /// Имя файла + /// Нужно ли использовать кодировку UTF8 With BOM или UTF8 Without BOM + /// Тип выходных данных + /// Список данных + public static IEnumerable ReadAll (string fileName, bool useUtf8WithBom = false) => + ReadAll(fileName, useUtf8WithBom ? Encoding.UTF8 : Encoding.UTF8.UTF8WithoutBom()); + #endregion } \ No newline at end of file diff --git a/anbs_cp/Extensions/ListExtensions.cs b/anbs_cp/Extensions/ListExtensions.cs new file mode 100644 index 0000000..523dd5d --- /dev/null +++ b/anbs_cp/Extensions/ListExtensions.cs @@ -0,0 +1,83 @@ +using System.Text; + +namespace anbs_cp.Extensions; + +/// +/// Класс-расширение для List +/// +public static class ListExtensions +{ + /// + /// Загрузка строк из текстового файла + /// + /// Список, в который нужно загрузит + /// Имя файла, который нужно загрузить + /// Использовать кодировку UTF8 With Bom + public static void LoadFromFile (this List list, string fileName, bool useUtf8WithBom = false) + { + // Очищаю список + list.Clear(); + + // Кодировка + Encoding fileEncoding = + useUtf8WithBom ? Encoding.UTF8 : Encoding.UTF8.UTF8WithoutBom(); + + // Открываю файл для чтения + using StreamReader reader = new(new FileStream(fileName, FileMode.Open), fileEncoding); + + // Пока есть строки в файле + while (reader.ReadLine() is { } line) + // - добавляю в список + list.Add(line); + } + + /// + /// Загрузка строк из типизированного файла + /// + /// Тип данных + /// Список, в который нужно загрузит + /// Имя файла, который нужно загрузить + /// Кодировка файла + public static void LoadFromFile (this List list, string fileName, Encoding encoding) + { + // Очищаю список + list.Clear(); + + // Добавляю в список загруженные строки + list.AddRange(FileExtension.ReadAll(fileName, encoding)); + } + + /// + /// Сохранение списка строк в файл + /// + /// Список + /// Имя файла + /// Использовать кодировку UTF8 With Bom + public static void SaveToFile (this List list, string fileName, bool useUtf8WithBom = false) + { + // Очищаю список + list.Clear(); + + // Кодировка + Encoding fileEncoding = + useUtf8WithBom ? Encoding.UTF8 : Encoding.UTF8.UTF8WithoutBom(); + + // Открываю файл для создания или перезаписи + using StreamWriter writer = new(new FileStream(fileName, FileMode.OpenOrCreate), fileEncoding); + + // Для каждой строки + foreach (string line in list) + // - записываю её + writer.WriteLine(line); + } + + /// + /// Сохранение списка строк в файл + /// + /// Тип данных + /// Список + /// Имя файла + /// Кодировка файла + public static void SaveToFile (this List list, string fileName, Encoding encoding) => + FileExtension.WriteAll(list.AsEnumerable(), fileName, encoding); +} \ No newline at end of file diff --git a/anbs_cp/anbs_cp.csproj b/anbs_cp/anbs_cp.csproj index 6b79559..7e2ae4d 100644 --- a/anbs_cp/anbs_cp.csproj +++ b/anbs_cp/anbs_cp.csproj @@ -2,7 +2,7 @@ net8.0 - 2024.4.3 + 2024.4.8 Александр Бабаев Набор компонентов ANB Software Библиотека полезных методов языка C#