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