diff --git a/anbs_cp/Classes/Exceptions/RenameException.cs b/anbs_cp/Classes/Exceptions/RenameException.cs new file mode 100644 index 0000000..e8eb5d5 --- /dev/null +++ b/anbs_cp/Classes/Exceptions/RenameException.cs @@ -0,0 +1,37 @@ +namespace anbs_cp.Classes.Exceptions; + +/// +/// Класс-исключение для переименования папок/файлов +/// +public sealed class RenameException : Exception +{ + /// + /// Имя файла/папки + /// + public string FileName { get; } + + /// + /// Описание ошибки + /// + public string? ErrorMessage { get; } + + /// + /// Конструктор + /// + /// Имя файла/папки + /// Описание ошибки + public RenameException(string fileName, string? errorMessage) : base(GetMessage(fileName, errorMessage ?? string.Empty)) + { + FileName = fileName; + ErrorMessage = errorMessage; + } + + /// + /// Получение текстового представление ошибки + /// + /// Имя файла/папки + /// Описание ошибки + /// Текстовое представление ошибки + private static string GetMessage(string fileName, string errorMessage) => + $"При переименовании файла/папки {fileName} возникла следующая ошибка: {errorMessage}"; +} \ No newline at end of file diff --git a/anbs_cp/Classes/LikeDelphi.cs b/anbs_cp/Classes/LikeDelphi.cs index 9776f1a..09a8afc 100644 --- a/anbs_cp/Classes/LikeDelphi.cs +++ b/anbs_cp/Classes/LikeDelphi.cs @@ -1,4 +1,7 @@ -namespace anbs_cp.Classes; +using anbs_cp.Classes.Exceptions; +using anbs_cp.Enums; + +namespace anbs_cp.Classes; /// /// Класс, добавляющий реализацию некоторых методов Delphi, которые упрощают работу в C#. @@ -10,7 +13,7 @@ public static class LikeDelphi /// /// Путь, к которому нужно добавить slash /// Путь со slash в конце - public static string IncludeTrailingBackslash(string path) + public static string IncludeTrailingBackslash (string path) { //По умолчанию сохраняем путь string result = path; @@ -29,5 +32,116 @@ public static class LikeDelphi /// Строка, которую нужно разбить /// Символ-делитель строки /// Массив строк - public static List ParseString(string str, char delimiter) => str.Split(delimiter).ToList(); + public static List ParseString (string str, char delimiter) => str.Split(delimiter).ToList(); + + /// + /// Переименовываю файл + /// + /// Старое имя файла (с полным путём) + /// Новое имя файла (с полным путём) + /// Что делать, если существует + /// Если имеет значение RaiseException, то генерируется ошибка переименования файла + public static void RenameFile (string oldName, string newName, + EOnExistAction ifExist = EOnExistAction.RaiseException) + { + //Если целевой файл существует + if (File.Exists(newName)) + switch (ifExist) + { + //Возбуждать исключение + case EOnExistAction.RaiseException: + throw new RenameException(newName, "Файл уже существует!"); + //Прерываю + case EOnExistAction.Abort: + return; + //Игнорирую и перезаписываю файл + case EOnExistAction.Ignore: + break; + //Только для папок (для файлов равносилен RaiseException) + case EOnExistAction.RaiseExceptionIfNotEmpty: + throw new RenameException(newName, "Файл уже существует!"); + //Только для папок (для файлов равносилен Abort) + case EOnExistAction.AbortIfNotEmpty: + return; + //по умолчанию - RaiseException + default: + throw new RenameException(newName, "Файл уже существует!"); + } + + //Перемещаю файл + File.Move(oldName, newName, true); + + //Если начальный файл существует + if (File.Exists(oldName)) + //- удаляю его + File.Delete(oldName); + } + + /// + /// Удаление папки + /// + /// Папка + public static void RemoveDir (string dir) => Directory.Delete(dir, true); + + /// + /// Проверяет папку на пустоту + /// Оригинальный ответ от OwenGlendower (https://www.cyberforum.ru/windows-forms/thread1995240.html) + /// + /// Проверяемая папка + /// Пуста (true) или не пуста (false) папка + public static bool IsDirEmpty (string dir) => !Directory.EnumerateFiles(dir, "*.*", SearchOption.AllDirectories).Any(); + + /// + /// Переименовывает папку + /// + /// Старое имя папки (с полным путём) + /// Новое имя папки (с полным путём) + /// Что делать, если существует + /// Если имеет значение RaiseException, то генерируется ошибка переименования папки + public static void RenameDir (string oldName, string newName, + EOnExistAction ifExist = EOnExistAction.RaiseException) + { + //Если целевая папка существует + if (Directory.Exists(newName)) + { + switch (ifExist) + { + //Возбуждать исключение + case EOnExistAction.RaiseException: + throw new RenameException(newName, "Папка уже существует!"); + //Прерывать + case EOnExistAction.Abort: + return; + //Игнорировать и перезаписывать папку + case EOnExistAction.Ignore: + break; + //Возбуждать исключение, если не пустая + case EOnExistAction.RaiseExceptionIfNotEmpty: + if (!IsDirEmpty(newName)) + throw new RenameException(newName, "Папка уже существует и не пуста!"); + + break; + //Прерывать, если не пустая + case EOnExistAction.AbortIfNotEmpty: + if (!IsDirEmpty(newName)) + return; + + break; + //по умолчанию - RaiseException + default: + throw new RenameException(newName, "Папка уже существует!"); + } + + //Удаляю целевую папку + RemoveDir(newName); + } + + //Перемещаю папку + Directory.Move(oldName, newName); + + //Если начальная папка существует + if (Directory.Exists(oldName)) + //- удаляю его + RemoveDir(oldName); + } } \ No newline at end of file diff --git a/anbs_cp/Classes/ValueConverter.cs b/anbs_cp/Classes/ValueConverter.cs index 8bb82ae..ca89b23 100644 --- a/anbs_cp/Classes/ValueConverter.cs +++ b/anbs_cp/Classes/ValueConverter.cs @@ -17,7 +17,7 @@ public abstract class ValueConverter: IValueConverter { ValueNames = valueNames; Divider = divider; - DecimalPlaces = (byte)(decimalPlaces < 3 ? decimalPlaces : 2); + DecimalPlaces = (byte)(decimalPlaces < 3 ? decimalPlaces : 2); } #region Реализация интерфейса diff --git a/anbs_cp/Enums/EOnExistAction.cs b/anbs_cp/Enums/EOnExistAction.cs new file mode 100644 index 0000000..345050d --- /dev/null +++ b/anbs_cp/Enums/EOnExistAction.cs @@ -0,0 +1,32 @@ +namespace anbs_cp.Enums; + +/// +/// Действия при операции переименования, если файл существует +/// +public enum EOnExistAction +{ + /// + /// Возбуждать исключение + /// + RaiseException = 0, + + /// + /// Прервать операцию + /// + Abort = 1, + + /// + /// Продолжить операцию + /// + Ignore = 2, + + /// + /// Возбуждать исключение, если папка не пуста (только для папок) + /// + RaiseExceptionIfNotEmpty = 3, + + /// + /// Прервать операцию, если папка не пуста (только для папок) + /// + AbortIfNotEmpty = 4 +} \ No newline at end of file diff --git a/anbs_cp/anbs_cp.csproj b/anbs_cp/anbs_cp.csproj index 7e963ea..b3185b3 100644 --- a/anbs_cp/anbs_cp.csproj +++ b/anbs_cp/anbs_cp.csproj @@ -2,7 +2,7 @@ net7.0 - 2023.129.0 + 2023.201.0 Alexander Babaev ANB Software Components Pack Library of some useful functions in C# language. diff --git a/anbsoftware.componentspack.sln.DotSettings b/anbsoftware.componentspack.sln.DotSettings index ebbe1a7..08f8a10 100644 --- a/anbsoftware.componentspack.sln.DotSettings +++ b/anbsoftware.componentspack.sln.DotSettings @@ -5,6 +5,7 @@ RA RAM True + True True True True @@ -13,6 +14,7 @@ True True True + True True True True