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

@ -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>

View File

@ -5,6 +5,7 @@
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RA/@EntryIndexedValue">RA</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RAM/@EntryIndexedValue">RAM</s:String>
<s:Boolean x:Key="/Default/UserDictionary/Words/=anbs/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Glendower/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0412_0435_0440_043D_0451_043C/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0412_0438_0434_0435_043E_043A_0430_0440_0442_0430/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_041F_0430_0440_0441_0435_0440/@EntryIndexedValue">True</s:Boolean>
@ -13,6 +14,7 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0432_0438_0434_0435_043E_043A_0430_0440_0442_0435/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0434_0435_0448_0438_0444_0440_043E_0432_0430_043D_0438_044F/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0438_043C_0451_043D/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_043F_0443_0442_0451_043C/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0447_0451_0442/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0447_0451_0442_0447_0438_043A/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0445_044D_0448_0430/@EntryIndexedValue">True</s:Boolean>