Помещаем файл в
"Корзину" (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);
Что может быть проще этого? Исходный код
примера можно посмотреть здесь.
|