From 3f774d751feff7c660f12d09cf99d69a234c3fc0 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 15 Apr 2023 15:12:53 +0300 Subject: [PATCH] 20230415 --- FileSplitter/Classes/Executor.cs | 288 ++++++++++++++++++ FileSplitter/FileSplitter.csproj | 4 + FileSplitter/Program.cs | 61 ++-- FileSplitterProj.sln.DotSettings | 2 + .../Classes/FileSplitterClass.cs | 78 ++++- FileSplitterShared/Classes/Localization.cs | 37 ++- FileSplitterShared/Enums/FileJoinOptions.cs | 7 +- FileSplitterShared/Enums/FsExitCode.cs | 42 +++ 8 files changed, 468 insertions(+), 51 deletions(-) create mode 100644 FileSplitter/Classes/Executor.cs create mode 100644 FileSplitterShared/Enums/FsExitCode.cs diff --git a/FileSplitter/Classes/Executor.cs b/FileSplitter/Classes/Executor.cs new file mode 100644 index 0000000..3dc210d --- /dev/null +++ b/FileSplitter/Classes/Executor.cs @@ -0,0 +1,288 @@ +using anbs_cp.Classes; + +using FileSplitter.Shared.Classes; +using FileSplitter.Shared.Enums; + +using static System.Console; + +namespace FileSplitter.Console.Classes; + +/// +/// Класс для выполнения разбиения, сборки, интерактивного режима +/// +internal static class Executor +{ + /// + /// Вывод прогресса + /// + /// Вызывающий объект + /// + private static void OnProgress (object sender, FileSplitterOnProgress args) + { + //Вывод сообщения в консоль + WriteLine(args.Message); + } + + /// + /// Выполняю разбиение + /// + /// Имя файла + /// Целевая папка с файлами разбиения + /// Размер части + /// Тихий режим (без запросов) + /// Параметры разбиения + /// Код возврата + public static FsExitCode DoSplit (string fileName, string targetDir, long partSize, bool silent, List options) + { + //Функция прогресса +#pragma warning disable CS8622 + FileSplitterClass.OnProgress += OnProgress; +#pragma warning restore CS8622 + + //Если не выбран тихий режим + if (!silent) + { + //- получаю информацию о разбиении + TargetFileInfo fileInfo = FileSplitterClass.GetSplitFileInfo(fileName, partSize); + + //- спрашиваю пользователя + WriteLine(Localization.MessageSplitAsk, fileInfo.FileName, + new FileSizeConverter(Localization.FileSizeStrings).Convert(fileInfo.FileSize), + BitConverter.ToString(fileInfo.FileHash).Replace("-", "").ToLowerInvariant(), + fileInfo.SplitCount); + + //- получаю ответ + string? userInput = ReadLine(); + + //- проверяю согласие + if (userInput == null || userInput.ToLower() != "y") + //-- и прерываю, если не получил + return FsExitCode.ecUserAborted; + } + + //Выполняю разбиение + return FileSplitterClass.SplitFile(fileName, targetDir, partSize, options.AsReadOnly()); + } + + /// + /// Выполняю сборку + /// + /// Файл информации о разбиении + /// Целевой файл + /// Тихий режим (без запросов) + /// Параметры сборки + /// Код возврата + public static FsExitCode DoJoin (string infoFileName, string targetFileName, bool silent, List options) + { + //Функция прогресса +#pragma warning disable CS8622 + FileSplitterClass.OnProgress += OnProgress; +#pragma warning restore CS8622 + + //Если не выбран тихий режим + if (!silent) + { + //- спрашиваю пользователя + WriteLine(Localization.MessageJoinAsk, targetFileName); + + //- получаю ответ + string? userInput = ReadLine(); + + //- проверяю согласие + if (userInput == null || userInput.ToLower() != "y") + //-- и прерываю, если не получил + return FsExitCode.ecUserAborted; + } + + //Выполняю объединение + return FileSplitterClass.JoinFile(infoFileName, targetFileName, options.AsReadOnly()); + } + + public static FsExitCode DoInteractive () + { + //Пользовательский ввод + string userInput; + + //Цикл получения информации + do + { + //Вывожу приветственный запрос на выбор операции + WriteLine(Localization.InteractiveStartAsk); + + //Получаю ответ + userInput = ReadLine() ?? string.Empty; + + //Обработано ли решение + bool handled = false; + + //Обрабатываем выбор пользователя + switch (userInput.ToLower()) + { + //Если пользователь выбрал разбиение + case "s": + { + //- то запускаем разбиение + FsExitCode splitExitCode = DoSplitInteractive(); + + //- вывожу сообщение + WriteLine(Localization.InteractiveOperationFinish, Localization.ExitCodeNames.First(eCode => eCode.Item1 == splitExitCode).Item2); + + //- указываем на перехват + handled = true; + break; + } + //Если пользователь указал на выход + case "e": + //- то указываем на перехват + handled = true; + break; + } + + //Если решение не обработано + if (!handled) + //- то вывожу сообщение + WriteLine(Localization.InteractiveWrongInput); + } while (userInput.ToLower() != "e"); + + //Закрываю интерактивную операцию + return FsExitCode.ecAllDone; + } + + /// + /// Интерактивное разбиение файла + /// + /// + public static FsExitCode DoSplitInteractive () + { + //Пользовательский ввод + string userInput; + + //Обработан ли ввод + bool isHandled = false; + + /* Имя файла */ + //Выбор имени файла + do + { + //Запрос имени файла + WriteLine(Localization.InteractiveSplitFileNameAsk); + + //Считываю имя файла + userInput = ReadLine() ?? string.Empty; + + //Если файл не существует + if (!File.Exists(userInput)) + { + //- то запрашиваю действие + WriteLine(Localization.InteractiveFileNameNotExist); + + //- считываю ответ + userInput = ReadLine() ?? string.Empty; + + //- если выбрано не повторять + if (userInput.ToLower() != "y") + //-- то прерываю операцию + return FsExitCode.ecUserAborted; + } + else + { + //В противном случае, считаю ввод корректным + isHandled = true; + } + } while (!isHandled); + + //Ввожу переменную с именем файла + string fileName = userInput; + + //Вывожу информацию о выборе файла + WriteLine(Localization.InteractiveSplitFileNameResult, fileName); + + /* Целевая папка */ + + //Выбираю целевую папку + WriteLine(Localization.InteractiveSplitTargetDirAsk); + + //Считываю данные + userInput = ReadLine() ?? string.Empty; + + //Если вместо папки пустое место + if (string.IsNullOrWhiteSpace(userInput)) + //- то задаю папку имени файла + userInput = Path.GetDirectoryName(fileName) ?? string.Empty; + + //Ввожу переменную целевой папки + string targetDir = LikeDelphi.IncludeTrailingBackslash(userInput); + + //Вывожу информацию о выборе целевой папки + WriteLine(Localization.InteractiveSplitTargetDirResult, targetDir); + + /* Размер части */ + //Ввожу переменную размера части + long partSize; + + //Создаю конвертер + FileSizeConverter converter = new(Localization.FileSizeStrings, 1); + + //Устанавливаю перехват в false + isHandled = false; + + //Выбор размер части + do + { + //Получаю размер исходного файла + long fileSize = FileExtension.FileSize(fileName); + + //Запрос размера части + WriteLine(Localization.InteractiveSplitPartSizeAsk); + + //Считываю размер части + userInput = ReadLine() ?? fileSize.ToString(); + + //Задаю размер части + partSize = TypeConverter.StrToInt64(userInput, fileSize); + + //Запрашиваю согласие на размер части + WriteLine(Localization.InteractiveSplitPartSizeAsk2, converter.Convert(partSize)); + + //Считываю ответ + userInput = ReadLine() ?? string.Empty; + + //Если согласен, то выхожу из цикла + if (userInput.ToLower() == "y") + isHandled = true; + } while (!isHandled); + + //Вывожу информацию о размере части + WriteLine(Localization.InteractiveSplitPartSizeResult, converter.Convert(partSize)); + + /* Опции разбиения */ + //Ввожу переменную опций разбиения + List options = new(); + + //Запрос опций разбиения + WriteLine(Localization.InteractiveSplitOptionsAsk); + + //Считываю опции разбиения + userInput = (ReadLine() ?? string.Empty).ToLower().Trim(); + + //Инициализирую список параметров + ConsoleParamsParser @params = new(userInput.Split(' ')); + + //Проверяю параметры разбиения + //- отключена ли проверка хэша + if (@params.HasParam("/NoCheckHash")) + options.Add(FileSplitOptions.fsoNoCheckHash); + //- нужно ли удалять исходный файл + if (@params.HasParam("/DeleteSource")) + options.Add(FileSplitOptions.fsoDeleteSourceFileAfterSplit); + //- нужно ли шифровать файл информации + if (@params.HasParam("/EncryptInfoFile")) + options.Add(FileSplitOptions.fsoEncryptInfoFile); + + //Вывожу информацию о выборе параметров + WriteLine(Localization.InteractiveSplitOptionsResult, userInput); + + /* Выполнение разбиения */ + return DoSplit(fileName, targetDir, partSize, false, options); + } +} \ No newline at end of file diff --git a/FileSplitter/FileSplitter.csproj b/FileSplitter/FileSplitter.csproj index 2792840..054744d 100644 --- a/FileSplitter/FileSplitter.csproj +++ b/FileSplitter/FileSplitter.csproj @@ -27,4 +27,8 @@ + + + + diff --git a/FileSplitter/Program.cs b/FileSplitter/Program.cs index fef5bdd..49eafa6 100644 --- a/FileSplitter/Program.cs +++ b/FileSplitter/Program.cs @@ -2,6 +2,7 @@ using anbs_cp.Classes; +using FileSplitter.Console.Classes; using FileSplitter.Shared.Classes; using FileSplitter.Shared.Enums; @@ -18,23 +19,24 @@ Console.WriteLine( $"\t{string.Format(Localization.AppCopyrights, DateTime.Now.Year == 2023 ? "2023" : $"2023 - {DateTime.Now.Year}")}"); Console.WriteLine("********************************************************************************"); -//Прерываем, если нет параметров -if (!consoleParser.HasParam("split") && !consoleParser.HasParam("join")) -{ - Console.WriteLine(Localization.MessageNoParameters); - return; -} -//Разделение файлов + +//Разделение файлов по параметрам if (consoleParser.HasParam("split")) - FileSplit(consoleParser); + return FileSplit4Params(consoleParser); -//Соединение файлов +//Соединение файлов по параметрам if (consoleParser.HasParam("join")) - FileJoin(consoleParser); + return FileJoin4Params(consoleParser); -//Функция разделения файлов -static void FileSplit (ConsoleParamsParser @params) +//Если нет параметров, то запускаем интерактивный режим +return StartInteractive(); + +//Запуск интерактивного режима +static int StartInteractive () => (int) Executor.DoInteractive(); + +//Функция разделения файлов для параметров +static int FileSplit4Params (ConsoleParamsParser @params) { //Проверяю наличие параметров if (!@params.HasParam("-fn") || !@params.HasParam("-td") || !@params.HasParam("-ps")) @@ -43,7 +45,7 @@ static void FileSplit (ConsoleParamsParser @params) Console.WriteLine(Localization.MessageNoParametersForSplit); //- прерываю - return; + return (int)FsExitCode.ecInvalidParameters; } //Получаю параметры @@ -67,17 +69,15 @@ static void FileSplit (ConsoleParamsParser @params) if (@params.HasParam("/EncryptInfoFile")) options.Add(FileSplitOptions.fsoEncryptInfoFile); - //Функция прогресса - #pragma warning disable CS8622 - FileSplitterClass.OnProgress += OnProgress; - #pragma warning restore CS8622 + //Получаю параметры консоли + bool silent = @params.HasParam("--silent"); //Выполняю разбиение - FileSplitterClass.SplitFile(fileName, targetDir, partSize, options.AsReadOnly()); + return (int)Executor.DoSplit(fileName, targetDir, partSize, silent, options); } -//Функция объединения -static void FileJoin (ConsoleParamsParser @params) +//Функция объединения для параметров +static int FileJoin4Params (ConsoleParamsParser @params) { //Проверяю наличие параметров if (!@params.HasParam("-ifn") || !@params.HasParam("-tfn")) @@ -86,7 +86,7 @@ static void FileJoin (ConsoleParamsParser @params) Console.WriteLine(Localization.MessageNoParametersForSplit); //- прерываю - return; + return (int)FsExitCode.ecInvalidParameters; } //Получаю параметры @@ -110,19 +110,12 @@ static void FileJoin (ConsoleParamsParser @params) //- нужно ли отключить проверку версии файла информации if (@params.HasParam("/IgnoreVersion")) options.Add(FileJoinOptions.fjoIgnoreSupportedScriptVersion); + //- нужно ли отключить проверку объединённого файла на корректность + if (@params.HasParam("/SkipCheck")) + options.Add(FileJoinOptions.fjoSkipCheckJoinedFile); - //Функция прогресса - #pragma warning disable CS8622 - FileSplitterClass.OnProgress += OnProgress; - #pragma warning restore CS8622 + //Получаю параметры консоли + bool silent = @params.HasParam("--silent"); - //Выполняю объединение - FileSplitterClass.JoinFile(infoFileName, targetFileName, options.AsReadOnly()); -} - -//Функция вывода прогресса -static void OnProgress (object sender, FileSplitterOnProgress args) -{ - //Вывод сообщения в консоль - Console.WriteLine(args.Message); + return (int)Executor.DoJoin(infoFileName, targetFileName, silent, options); } \ No newline at end of file diff --git a/FileSplitterProj.sln.DotSettings b/FileSplitterProj.sln.DotSettings index a08159e..c9a7ea6 100644 --- a/FileSplitterProj.sln.DotSettings +++ b/FileSplitterProj.sln.DotSettings @@ -1,5 +1,7 @@  True + True + True True True True diff --git a/FileSplitterShared/Classes/FileSplitterClass.cs b/FileSplitterShared/Classes/FileSplitterClass.cs index c0627b7..1c4b439 100644 --- a/FileSplitterShared/Classes/FileSplitterClass.cs +++ b/FileSplitterShared/Classes/FileSplitterClass.cs @@ -22,6 +22,31 @@ public static class FileSplitterClass /// public static event EventHandler? OnProgress; + /// + /// Получает информацию о файле, который готовится к разбиению + /// + /// Имя файла + /// Размер части + /// Информация о файле () + public static TargetFileInfo GetSplitFileInfo (string fileName, long partSize) + { + //Получаю размер текущего файла + long fileSize = FileExtension.FileSize(fileName); + + //Получаю информацию о целевом файле + return new() + { + //Имя файла + FileName = Path.GetFileName(fileName), + //Размер файла + FileSize = fileSize, + //md5-сумма файла (хэш) + FileHash = new FileHash(fileName).Hash, + //Количество кусков + SplitCount = (long)Math.Round(fileSize / (decimal)partSize, MidpointRounding.ToPositiveInfinity) + }; + } + /// /// Разделение файла на части /// @@ -29,7 +54,8 @@ public static class FileSplitterClass /// Папка, в которую нужно сохранить файлы /// Размер части в байтах /// Параметры разбиения - public static void SplitFile (string fileName, string targetDir, long partSize, ReadOnlyCollection options) + /// Код возврата + public static FsExitCode SplitFile (string fileName, string targetDir, long partSize, ReadOnlyCollection options) { //Задаю обработчик для распаковки EventHandler? onProgressEvent = OnProgress; @@ -57,14 +83,7 @@ public static class FileSplitterClass long fileSize = FileExtension.FileSize(fileName); //Получаю информацию о целевом файле - splitInfo.TargetFile = new() - { - FileName = Path.GetFileName(fileName), - FileSize = fileSize, - FileHash = new FileHash(fileName).Hash, - // ReSharper disable once PossibleLossOfFraction - SplitCount = (long)Math.Round(fileSize / (decimal)partSize, MidpointRounding.ToPositiveInfinity) - }; + splitInfo.TargetFile = GetSplitFileInfo(fileName, partSize); //Открываю файл BinaryReader fileReader = new(File.Open(fileName, FileMode.Open)); @@ -126,9 +145,14 @@ public static class FileSplitterClass if (!options.Contains(FileSplitOptions.fsoNoCheckHash)) //- и если не прошли проверку if (!CheckHash(targetDir, Path.GetFileName(fileName), splitInfo.SplitFiles)) + { //- то удаляем файлы разбиения DeleteSplitFiles(Path.GetFileName(fileName), targetDir, splitInfo.TargetFile.SplitCount); + //- возвращаю ошибку хэша + return FsExitCode.ecSplitFileHashError; + } + //Имя файла информации о разбиении string reportFileName = $"{LikeDelphi.IncludeTrailingBackslash(targetDir)}{Path.GetFileName(fileName)}.fsi"; @@ -150,6 +174,9 @@ public static class FileSplitterClass if (options.Contains(FileSplitOptions.fsoDeleteSourceFileAfterSplit)) //- то удаляю его File.Delete(fileName); + + //Закрываю консоль с успехом + return FsExitCode.ecAllDone; } /// @@ -158,7 +185,8 @@ public static class FileSplitterClass /// Имя файла с информацией о разделении /// Целевой файл /// Параметры объединения - public static void JoinFile (string infoFileName, string targetFileName, ReadOnlyCollection options) + /// Код возврата + public static FsExitCode JoinFile (string infoFileName, string targetFileName, ReadOnlyCollection options) { //Задаю обработчик для распаковки EventHandler? onProgressEvent = OnProgress; @@ -195,7 +223,7 @@ public static class FileSplitterClass { onProgressEvent?.Invoke(null, new(0, 0, Localization.MessageJoinUnknownFile)); - Environment.Exit(2); + return FsExitCode.ecUnknownInfoFile; } //Проверяю версию @@ -207,7 +235,7 @@ public static class FileSplitterClass new(0, 0, string.Format(Localization.MessageJoinUnsupportedFile, splitInfo.FileSplitterVersion))); //Прерываю - return; + return FsExitCode.ecInfoVersionUnsupported; } //Получаю папку с разделёнными файлами @@ -221,7 +249,7 @@ public static class FileSplitterClass onProgressEvent?.Invoke(null, new(0, 0, Localization.MessageJoinHashError)); //Прерываю - return; + return FsExitCode.ecSplitFileHashError; } //Открываю файл @@ -260,12 +288,36 @@ public static class FileSplitterClass //Освобождаю память fileWriter.Dispose(); + //Проверяю объединённый файл + //- получаю хэш + IStructuralEquatable fileHashEq = new FileHash(targetFileName).Hash; + + //- проверяю + if ( + //-- проверка не отключена опцией + !options.Contains(FileJoinOptions.fjoSkipCheckJoinedFile) && + //-- совпадает ли размер + FileExtension.FileSize(targetFileName) != splitInfo.TargetFile.FileSize && + //-- совпадает ли хэш + !fileHashEq.Equals(splitInfo.TargetFile.FileHash, StructuralComparisons.StructuralEqualityComparer) + ) + { + //Вывожу сообщение + onProgressEvent?.Invoke(null, new(0, 0, Localization.MessageJoinCheckError)); + + //Прерываю + return FsExitCode.ecTargetFileCheckError; + } + //Вывожу сообщение onProgressEvent?.Invoke(null, new(0, 0, Localization.MessageJoinComplete)); //Удаляю разделённые файлы if (options.Contains(FileJoinOptions.fjoDeleteSourceFilesAfterJoin)) DeleteSplitFiles(splitInfo.TargetFile.FileName, sourceDir, splitInfo.TargetFile.SplitCount); + + //Возвращаю успех + return FsExitCode.ecAllDone; } /// diff --git a/FileSplitterShared/Classes/Localization.cs b/FileSplitterShared/Classes/Localization.cs index a3fde19..93157e0 100644 --- a/FileSplitterShared/Classes/Localization.cs +++ b/FileSplitterShared/Classes/Localization.cs @@ -1,4 +1,6 @@ -namespace FileSplitter.Shared.Classes; +using FileSplitter.Shared.Enums; + +namespace FileSplitter.Shared.Classes; public static class Localization { @@ -8,24 +10,53 @@ public static class Localization public const string AppCopyrights = "Авторские права (C) {0}, Александр Бабаев."; //Сообщения - public const string MessageNoParameters = - "Нет параметров. Информацию о работе с программой смотрите в файле \"Help\\Russian\\Console.html\""; public const string MessageNoParametersForSplit = "Не заданы параметры разбиения. Информацию о работе с программой смотрите в файле \"Help\\Russian\\Console.html\""; + public const string MessageSplitAsk = + "Информация о разбиваемом файле:\n***{0}\n***Размер: {1}\n***Хэш файла: {2}\n***Предполагается разбиение на {3} части(-ей)\nВы хотите начать разбиение? [Y|y - да, Любая другая буква/слово/выражение - нет]"; public const string MessageStartSplit = "Запущено разбиение файла {0} на части размером {1} и сохранением их в директории {2}."; public const string MessageSplitFilePart = "Идёт обработка части {0} из {1}..."; public const string MessageSplitComplete = "Разбиение файла {0} завершено!"; public const string MessageHashCheckStart = "Начинаю проверку хэша разбиения"; public const string MessageHashCheckFail = "К сожалению, файл \"{0}\" не прошёл проверку хэша!"; public const string MessageHashCheckComplete = "Проверка хэша завершена!"; + public const string MessageJoinAsk = "Вы хотите начать сборку файла {0}? [Y|y - да, любая другая буква/слово/выражение - нет]"; public const string MessageStartJoin = "Запущено объединение файлов, заданных файлом информации {0}, в файл {1}."; public const string MessageJoinUnsupportedFile = "К сожалению, версия файла информации {0} не поддерживается!"; public const string MessageJoinUnknownFile = "Не могу прочитать файл информации! Возможно он зашифрован?"; public const string MessageJoinHashError = "К сожалению, разделённые файлы не прошли проверку. Возможно они повреждены?"; + public const string MessageJoinCheckError = + "К сожалению, объединённый файл не прошли проверку корректности объединения. Возможно были какие-либо ошибки?"; public const string MessageJoinFilePart = "Идёт обработка части {0} из {1}..."; public const string MessageJoinComplete = "Объединение файла {0} завершено!"; + //Сообщения интерактивного режима + public const string InteractiveStartAsk = "Выберете одно из действий:\n* S|s - разбиение\n* J|j - объединение\n* E|e - выход\nВаш выбор:"; + public const string InteractiveWrongInput = "Выбрано неизвестное действие!"; + public const string InteractiveOperationFinish = "Операция завершена с кодом: {0}"; + public const string InteractiveSplitFileNameAsk = "Введите имя разбиваемого файла (или перетащите его сюда):"; + public const string InteractiveFileNameNotExist = "Файл не существует! Повторить ввод файла? [Y|y - для повтора, любая другая буква - прерывание операции]"; + public const string InteractiveSplitFileNameResult = "Для разбиения выбран файл: {0}"; + public const string InteractiveSplitTargetDirAsk = "Выберете папку, куда следует сохранить части файла (или оставьте пустым, чтобы использовать папку разбиваемого файла):"; + public const string InteractiveSplitTargetDirResult = "Файлы разбиения будут сохранены в папке: {0}"; + public const string InteractiveSplitPartSizeAsk = "Введите размер части (в байтах):"; + public const string InteractiveSplitPartSizeAsk2 = "Вы выбрали размер части {0}. Всё правильно? [Y|y - да, продолжить, любая другая буква - нет, повторить ввод]"; + public const string InteractiveSplitPartSizeResult = "Выбран размер части: {0}"; + public const string InteractiveSplitOptionsAsk = "Введите дополнительные параметры разбиения (разделитель - пробел):"; + public const string InteractiveSplitOptionsResult = "Выбраны дополнительные параметры: [{0}]"; //Константы размеров public static readonly string[] FileSizeStrings = { "байт", "Кб", "Мб", "Гб", "Тб" }; + + //Переводы кодов возврата + public static readonly List<(FsExitCode, string)> ExitCodeNames = new() + { + (FsExitCode.ecAllDone, "Успешно завершено"), + (FsExitCode.ecInvalidParameters, "Неверные параметры"), + (FsExitCode.ecUserAborted, "Прервано пользователем"), + (FsExitCode.ecUnknownInfoFile, "Неизвестный файл информации о разбиении"), + (FsExitCode.ecInfoVersionUnsupported, "Версия файла информации о разбиении не поддерживается"), + (FsExitCode.ecSplitFileHashError, "Ошибка проверки хэш-суммы разделённых файлов"), + (FsExitCode.ecTargetFileCheckError, "Ошибка проверки целостности собираемого файла") + }; } \ No newline at end of file diff --git a/FileSplitterShared/Enums/FileJoinOptions.cs b/FileSplitterShared/Enums/FileJoinOptions.cs index 5c7a910..942a130 100644 --- a/FileSplitterShared/Enums/FileJoinOptions.cs +++ b/FileSplitterShared/Enums/FileJoinOptions.cs @@ -23,5 +23,10 @@ public enum FileJoinOptions /// /// Игнорировать не поддерживаемую версию файла информации /// - fjoIgnoreSupportedScriptVersion = 3 + fjoIgnoreSupportedScriptVersion = 3, + + /// + /// Пропустить проверку объединённого файла на корректность + /// + fjoSkipCheckJoinedFile = 4 } \ No newline at end of file diff --git a/FileSplitterShared/Enums/FsExitCode.cs b/FileSplitterShared/Enums/FsExitCode.cs new file mode 100644 index 0000000..929903a --- /dev/null +++ b/FileSplitterShared/Enums/FsExitCode.cs @@ -0,0 +1,42 @@ +namespace FileSplitter.Shared.Enums; + +/// +/// Коды возврата +/// +public enum FsExitCode +{ + /// + /// Успешно завершено + /// + ecAllDone = 0, + + /// + /// Неверные параметры + /// + ecInvalidParameters = 1, + + /// + /// Прервано пользователем + /// + ecUserAborted = 2, + + /// + /// Неизвестный файл информации о разбиении + /// + ecUnknownInfoFile = 3, + + /// + /// Версия файла информации о разбиении не поддерживается + /// + ecInfoVersionUnsupported = 4, + + /// + /// Ошибка проверки хэш-суммы разделённых файлов + /// + ecSplitFileHashError = 5, + + /// + /// Ошибка проверки целостности собираемого файла + /// + ecTargetFileCheckError = 6 +} \ No newline at end of file