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