Домой Windows Удаление файла или папки в корзину: Справочник по C#

Удаление файла или папки в корзину: Справочник по C#

968
0


/// 
/// Перечисление FileOperationType для функции определяет, что делать с файлом.
/// 
public enum FileOperationType : uint
{
/// 
/// Переместить файл
/// 
FO_MOVE = 0x0001,
/// 
/// Копировать файл
/// 
FO_COPY = 0x0002,
/// 
/// Удалить (в корзину или безвозвратно) файл
/// 
FO_DELETE = 0x0003,
/// 
/// Переименовать файл
/// 
FO_RENAME = 0x0004,
}

/// 
/// SHFILEOPSTRUCT для функции. Здесь два объявления самой функции и этой структуры,
/// используемые в зависимости от разрядности системы
/// 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
private struct SHFILEOPSTRUCT_x86
{
public IntPtr hwnd;
[MarshalAs(UnmanagedType.U4)]
public FileOperationType wFunc;
public string pFrom;
public string pTo;
public FileOperationFlags fFlags;
[MarshalAs(UnmanagedType.Bool)]
public bool fAnyOperationsAborted;
public IntPtr hNameMappings;
public string lpszProgressTitle;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private struct SHFILEOPSTRUCT_x64
{
public IntPtr hwnd;
[MarshalAs(UnmanagedType.U4)]
public FileOperationType wFunc;
public string pFrom;
public string pTo;
public FileOperationFlags fFlags;
[MarshalAs(UnmanagedType.Bool)]
public bool fAnyOperationsAborted;
public IntPtr hNameMappings;
public string lpszProgressTitle;
}

//Собственно, само объявление функции
[DllImport("shell32.dll", CharSet = CharSet.Auto, EntryPoint = "SHFileOperation")]
private static extern int SHFileOperation_x86(ref SHFILEOPSTRUCT_x86 FileOp);

[DllImport("shell32.dll", CharSet = CharSet.Auto, EntryPoint = "SHFileOperation")]
private static extern int SHFileOperation_x64(ref SHFILEOPSTRUCT_x64 FileOp);

Эта функция определяет, 32-битная или 64-битная система
private static bool IsWOW64Process()
{
return IntPtr.Size == 8;
}

/// 
/// Эта функция отправляет файл или папку в корзину
/// 
/// Полное имя файла или папки, которую нужно удалить/// FileOperationFlags в дополнение к флагу FOF_ALLOWUNDO, /// который уже заданpublic static bool Send(string path, FileOperationFlags flags)
{
try
{
//если 64-битная система
if (IsWOW64Process())
{
//создаем новую структуру
SHFILEOPSTRUCT_x64 fs = new SHFILEOPSTRUCT_x64();
//указываем, что файл будет удаляться
fs.wFunc = FileOperationType.FO_DELETE;
//Непонятно, почему, но если функции передать структуру, в которой указан "нормальный"
//путь, то произойдет ошибка
fs.pFrom = path + '' + '';
//установка флагов
fs.fFlags = FileOperationFlags.FOF_ALLOWUNDO | flags;
//выполнение функции
SHFileOperation_x64(ref fs);
}
else
{
//система 32-битная. Здесь все так же, как для 64-битной системы, только структура и
//функция уже 32-битные
SHFILEOPSTRUCT_x86 fs = new SHFILEOPSTRUCT_x86();
fs.wFunc = FileOperationType.FO_DELETE;
fs.pFrom = path + '' + '';
fs.fFlags = FileOperationFlags.FOF_ALLOWUNDO | flags;
SHFileOperation_x86(ref fs);
}
//все прошло успешно, возвращаем true
return true;
}
catch
{
//произошла какая-то ошибка, возвращаем false
return false;
}
}

/// 
/// Необходимые флаги для функции SHFileOperation.
/// 
[Flags]
public enum FileOperationFlags : ushort
{
/// 
/// Не показывать диалог с индикатором прогресса в течение процесса удаления.
/// 
FOF_SILENT = 0x0004,
/// 
/// Не спрашивать у пользователя подтверждения удаления.
/// 
FOF_NOCONFIRMATION = 0x0010,
/// 
/// Удалить файл в корзину. Этот флаг нужен для того, чтобы файл был удален именно в корзину.
/// 
FOF_ALLOWUNDO = 0x0040,
/// 
/// Не показывать, какие файлы иили папки удаляются, в диалоге с индикатором прогресса.
/// 
FOF_SIMPLEPROGRESS = 0x0100,
/// 
/// Не показывать сообщения об ошибках, которые могут возникнуть в течение процесса.
/// 
FOF_NOERRORUI = 0x0400,
/// 
/// Предупреждать, что удаляемые файлы слишком велики для помещения в корзину и поэтому
/// будут удалены безвозвратно.
/// 
FOF_WANTNUKEWARNING = 0x4000,
}


Источник www.cyberforum.ru

ЧИТАТЬ ТАКЖЕ:  Получение иконки приложения по расширению.: Справочник по C#

Удаление файла или папки в корзину: Справочник по C#

0.00 (0%) 0 votes

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь