15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Помещаем файл в "Корзину" (Recycle Bin)

Этим занимается API функция оболочки под названием SHFileOperation, объявленная в shellapi.h. Для того, чтобы воспользоваться этой функцией, необходимо заполнить специальную структуру SHFILEOPSTRUCT, которая указывает, какую операцию необходимо проделать, какой файл необходимо удалить, а так же другую важную информацию:

int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);

struct SHFILEOPSTRUCT{ 
    HWND hwnd;                          // NULL (диалога прогреса, не
                                        // используем)
    UINT wFunc;                         // FO_DELETE (операция удаления)
    LPCTSTR pFrom;                      // имя файла(ов) для удаления
    LPCTSTR pTo;                        // NULL (для удаления не используется)
    FILEOP_FLAGS fFlags;                // см. ниже
    BOOL fAnyOperationsAborted;         // (возвращает TRUE если пользователь
                                        // прервал) не используем
    LPVOID hNameMappings;               // для удаления не используется
    LPCSTR lpszProgressTitle;           // для удаления не используется
};

// Используемые флаги
#define FOF_SILENT      0x0004          // не показывать процесс удаления
#define FOF_NOERRORUI   0x0400          // не выводить ошибки
#define FOF_ALLOWUNDO   0x0040          // ОБЯЗАТЕЛЬНО для корзины!!!
#define FOF_NOCONFIRMATION 0x0010       // Не спрашивать пользователя OK
                                        // для подтверждения удаления

SHFileOperation позволяет копировать, удалять, перемещать или переименовывать один или несколько файлов.

   Итак, теперь о главном. Для того, чтобы удалить файл с помещением его в корзину, необходимо использовать флаг FOF_ALLOWUNDO, присвоив значение pFrom равное FO_DELETE. Если же задать только имя файла без пути, то файл будет удалён без помещения в корзину.

   Прилагаемый пример содержит небольшой класс CRecycleFile, который призван упростить данную процедуру. Пример представляет из себя консольное приложение:


RECYCLE в действии

   Вот элементарный приём использования данного класса:

LPCTSTR pszPathName = GetFileNameSomehow(); // полный путь с именем!
CRecycleFile rf;
rf.Recycle(pszPathName);

Что может быть проще этого? Исходный код примера можно посмотреть здесь.