
////// Перечисление 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 + '