This commit is contained in:
2023-02-01 21:19:41 +03:00
parent 9afdd62f24
commit 63b5cfeed8
6 changed files with 190 additions and 5 deletions

View File

@@ -0,0 +1,37 @@
namespace anbs_cp.Classes.Exceptions;
/// <summary>
/// Класс-исключение для переименования папок/файлов
/// </summary>
public sealed class RenameException : Exception
{
/// <summary>
/// Имя файла/папки
/// </summary>
public string FileName { get; }
/// <summary>
/// Описание ошибки
/// </summary>
public string? ErrorMessage { get; }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="fileName">Имя файла/папки</param>
/// <param name="errorMessage">Описание ошибки</param>
public RenameException(string fileName, string? errorMessage) : base(GetMessage(fileName, errorMessage ?? string.Empty))
{
FileName = fileName;
ErrorMessage = errorMessage;
}
/// <summary>
/// Получение текстового представление ошибки
/// </summary>
/// <param name="fileName">Имя файла/папки</param>
/// <param name="errorMessage">Описание ошибки</param>
/// <returns>Текстовое представление ошибки</returns>
private static string GetMessage(string fileName, string errorMessage) =>
$"При переименовании файла/папки {fileName} возникла следующая ошибка: {errorMessage}";
}

View File

@@ -1,4 +1,7 @@
namespace anbs_cp.Classes;
using anbs_cp.Classes.Exceptions;
using anbs_cp.Enums;
namespace anbs_cp.Classes;
/// <summary>
/// Класс, добавляющий реализацию некоторых методов Delphi, которые упрощают работу в C#.
@@ -10,7 +13,7 @@ public static class LikeDelphi
/// </summary>
/// <param name="path">Путь, к которому нужно добавить slash</param>
/// <returns>Путь со slash в конце</returns>
public static string IncludeTrailingBackslash(string path)
public static string IncludeTrailingBackslash (string path)
{
//По умолчанию сохраняем путь
string result = path;
@@ -29,5 +32,116 @@ public static class LikeDelphi
/// <param name="str">Строка, которую нужно разбить</param>
/// <param name="delimiter">Символ-делитель строки</param>
/// <returns>Массив строк</returns>
public static List<string> ParseString(string str, char delimiter) => str.Split(delimiter).ToList();
public static List<string> ParseString (string str, char delimiter) => str.Split(delimiter).ToList();
/// <summary>
/// Переименовываю файл
/// </summary>
/// <param name="oldName">Старое имя файла (с полным путём)</param>
/// <param name="newName">Новое имя файла (с полным путём)</param>
/// <param name="ifExist">Что делать, если существует</param>
/// <exception cref="RenameException">Если <paramref name="ifExist" /> имеет значение <value>RaiseException</value>, то генерируется ошибка переименования файла</exception>
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);
}
/// <summary>
/// Удаление папки
/// </summary>
/// <param name="dir">Папка</param>
public static void RemoveDir (string dir) => Directory.Delete(dir, true);
/// <summary>
/// Проверяет папку на пустоту
/// Оригинальный ответ от OwenGlendower (https://www.cyberforum.ru/windows-forms/thread1995240.html)
/// </summary>
/// <param name="dir">Проверяемая папка</param>
/// <returns>Пуста (<value>true</value>) или не пуста (<value>false</value>) папка <see cref="dir"/></returns>
public static bool IsDirEmpty (string dir) => !Directory.EnumerateFiles(dir, "*.*", SearchOption.AllDirectories).Any();
/// <summary>
/// Переименовывает папку
/// </summary>
/// <param name="oldName">Старое имя папки (с полным путём)</param>
/// <param name="newName">Новое имя папки (с полным путём)</param>
/// <param name="ifExist">Что делать, если существует</param>
/// <exception cref="RenameException">Если <paramref name="ifExist" /> имеет значение <value>RaiseException</value>, то генерируется ошибка переименования папки</exception>
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);
}
}

View File

@@ -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 Реализация интерфейса

View File

@@ -0,0 +1,32 @@
namespace anbs_cp.Enums;
/// <summary>
/// Действия при операции переименования, если файл существует
/// </summary>
public enum EOnExistAction
{
/// <summary>
/// Возбуждать исключение
/// </summary>
RaiseException = 0,
/// <summary>
/// Прервать операцию
/// </summary>
Abort = 1,
/// <summary>
/// Продолжить операцию
/// </summary>
Ignore = 2,
/// <summary>
/// Возбуждать исключение, если папка не пуста (только для папок)
/// </summary>
RaiseExceptionIfNotEmpty = 3,
/// <summary>
/// Прервать операцию, если папка не пуста (только для папок)
/// </summary>
AbortIfNotEmpty = 4
}

View File

@@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Version>2023.129.0</Version>
<Version>2023.201.0</Version>
<Authors>Alexander Babaev</Authors>
<Product>ANB Software Components Pack</Product>
<Description>Library of some useful functions in C# language.</Description>